/*
* RHQ Management Platform
* Copyright (C) 2005-2010 Red Hat, Inc.
* All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2, as
* published by the Free Software Foundation, and/or the GNU Lesser
* General Public License, version 2.1, also as published by the Free
* Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with this program;
* if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package org.rhq.bundle.ant.type;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
import org.testng.annotations.Test;
@Test
public class AbstractBundleTypeTest {
private static final String realBasedir = (File.separatorChar == '/') ? "/basedir" : "c:\\basedir";
// normalized basedir
private static final String basedir = (File.separatorChar == '/') ? "/basedir" : "c:/basedir";
public void testGetPattern() {
Pattern regex;
String expectedPattern = "(" + basedir + "/(easy\\.txt))|(" + basedir + "/(test\\.txt))";
regex = assertPatternsRegex(realBasedir, expectedPattern, "easy.txt", "test.txt");
assert regex.matcher(basedir + "/easy.txt").matches() : regex.pattern() + " vs. " + basedir + "/easy.txt";
assert regex.matcher(basedir + "/test.txt").matches();
assert !regex.matcher(basedir + "/easyXtxt").matches();
assert !regex.matcher(basedir + "/testXtxt").matches();
assert !regex.matcher(basedir + "/easy.txtX").matches();
assert !regex.matcher(basedir + "/test.txtX").matches();
assert !regex.matcher(basedir + "X/easy.txt").matches();
assert !regex.matcher(basedir + "X/test.txt").matches();
assert !regex.matcher("easy.txt").matches() : "missing basedir";
assert !regex.matcher("test.txt").matches() : "missing basedir";
regex = assertPatternsRegex("AB CD", "(AB CD/([^/]*\\.txt))|(AB CD/(test\\.[^/]*))", "*.txt", "test.*");
assert regex.matcher("AB CD/easy.txt").matches();
assert regex.matcher("AB CD/test.xml").matches();
assert regex.matcher("AB CD/test.txt").matches();
assert regex.matcher("AB CD/test.").matches();
assert regex.matcher("AB CD/test.wotgorilla?").matches();
assert regex.matcher("AB CD/.txt").matches();
assert !regex.matcher("AB CD/txt").matches();
assert !regex.matcher("AB CD/Xtxt").matches();
assert !regex.matcher("AB CD/testX").matches() : "missing the dot";
assert !regex.matcher("AB CD/easy.txtX").matches();
assert !regex.matcher("AB CDX/easy.txt").matches();
assert !regex.matcher("AB CDX/test.xml").matches();
assert !regex.matcher("easy.txt").matches() : "missing basedir";
assert !regex.matcher("test.txt").matches() : "missing basedir";
regex = assertPatternsRegex("A", "(A/(.*.\\.txt))|(A/(sub/.*[^/]*\\.xml))", "**/?.txt", "sub/**/*.xml");
assert regex.matcher("A/1.txt").matches();
assert regex.matcher("A/BB/CCC/1.txt").matches();
//assert !regex.matcher("A/12.txt").matches(); // TODO: THIS ASSERT FAILS! FIX THIS!!
//assert !regex.matcher("A/B/C/12.txt").matches(); // TODO: THIS ASSERT FAILS! FIX THIS!!
assert regex.matcher("A/sub/foo.xml").matches();
assert regex.matcher("A/sub/BB/CCC/1.xml").matches();
assert regex.matcher("A/sub/.xml").matches();
assert !regex.matcher("A/.txt").matches() : "? infers at least one and only one - this has nothing to match the ?";
assert !regex.matcher("A/1.txtX").matches();
assert !regex.matcher("A/subX/foo.xml").matches();
assert !regex.matcher("A/subX/BB/CCC/1.xml").matches();
assert !regex.matcher("A/sub/foo.xmlX").matches();
assert !regex.matcher("1.txt").matches() : "missing basedir";
assert !regex.matcher("sub/foo.xml").matches() : "missing basedir";
}
private Pattern assertPatternsRegex(String baseDir, String expectedPattern, String... patterns) {
List<FileSet> fileSets = new ArrayList<FileSet>();
for (String pattern : patterns) {
FileSet fileSet = new FileSet();
fileSet.setIncludes(pattern);
fileSet.setDir(baseDir);
fileSets.add(fileSet);
}
Pattern regex = AbstractBundleType.getPattern(fileSets);
assert regex != null : "The regex was not able to be produced - it was null";
assert expectedPattern.equals(regex.pattern()) : "The expected pattern [" + expectedPattern
+ "] did not match the actual pattern [" + regex.pattern() + "]";
return regex;
}
public void testBuildIncludePatternRegex() {
Pattern regex;
regex = assertIncludePatternRegex("easy.txt", "easy\\.txt", "easy.txt");
assert !regex.matcher("easyXtxt").matches() : "should not have matched, is the . escaped?";
assert !regex.matcher("Xeasy.txt").matches();
assert !regex.matcher("easy.txtX").matches();
assert !regex.matcher("/easy.txt").matches();
assert !regex.matcher("easy.txt/").matches();
regex = assertIncludePatternRegex("another.one/easy.txt", "another\\.one/easy\\.txt", "another.one/easy.txt");
assert !regex.matcher("anotherXone/easyXtxt").matches() : "should not have matched, is the . escaped?";
assert !regex.matcher("another.one/easy.txtX").matches();
assert !regex.matcher("another.one/easy.txt/X").matches();
assert !regex.matcher("Xanother.one/easy.txt").matches();
assert !regex.matcher("X/another.one/easy.txt").matches();
assert !regex.matcher("/another.one/easy.txt").matches();
assert !regex.matcher("another.one/easy.txt/").matches();
regex = assertIncludePatternRegex("*.properties", "[^/]*\\.properties", "any.properties");
assert !regex.matcher("anyXproperties").matches() : "should not have matched, is the . escaped?";
assert regex.matcher("with space.properties").matches();
assert !regex.matcher("subdir/any.properties").matches();
assert !regex.matcher("any.properties/foo").matches();
regex = assertIncludePatternRegex("a*b.properties", "a[^/]*b\\.properties", "a123b.properties");
assert !regex.matcher("a123bXproperties").matches() : "should not have matched, is the . escaped?";
assert regex.matcher("a b.properties").matches();
assert regex.matcher("ab.properties").matches();
assert !regex.matcher("subdir/a123b.properties").matches();
assert !regex.matcher("a123b.properties/foo").matches();
regex = assertIncludePatternRegex("/*.properties", "/[^/]*\\.properties", "/any.properties");
assert !regex.matcher("/anyXproperties").matches() : "should not have matched, is the . escaped?";
assert regex.matcher("/with space.properties").matches();
assert !regex.matcher("subdir/any.properties").matches();
assert !regex.matcher("/any.properties/foo").matches();
regex = assertIncludePatternRegex("?.properties", ".\\.properties", "a.properties");
assert !regex.matcher("aXproperties").matches() : "should not have matched, is the . escaped?";
assert !regex.matcher("ab.properties").matches();
assert regex.matcher(" .properties").matches();
assert !regex.matcher(".properties").matches();
assert !regex.matcher("subdir/a.properties").matches();
assert !regex.matcher("a.properties/foo").matches();
regex = assertIncludePatternRegex("a?b.properties", "a.b\\.properties", "aNb.properties");
assert !regex.matcher("aNbXproperties").matches() : "should not have matched, is the . escaped?";
assert regex.matcher("a b.properties").matches();
assert !regex.matcher("ab.properties").matches();
assert !regex.matcher("subdir/aNb.properties").matches();
assert !regex.matcher("aNb.properties/foo").matches();
regex = assertIncludePatternRegex("/?.properties", "/.\\.properties", "/a.properties");
assert !regex.matcher("/aXproperties").matches() : "should not have matched, is the . escaped?";
assert !regex.matcher("/ab.properties").matches();
assert regex.matcher("/ .properties").matches();
assert !regex.matcher("/.properties").matches();
assert !regex.matcher("subdir/a.properties").matches();
assert !regex.matcher("/a.properties/foo").matches();
regex = assertIncludePatternRegex("file*.xml", "file[^/]*\\.xml", "fileANY.xml");
assert !regex.matcher("fileANYXxml").matches() : "should not have matched, is the . escaped?";
assert regex.matcher("fileWITH SPACE.xml").matches();
assert !regex.matcher("subdir/fileANY.xml").matches();
assert !regex.matcher("fileANY.xml/foo").matches();
assert regex.matcher("file.xml").matches();
regex = assertIncludePatternRegex("*/*.properties", "[^/]*/[^/]*\\.properties", "aaa/bbb.properties");
assert !regex.matcher("aaa/bbbXproperties").matches() : "should not have matched, is the . escaped?";
assert !regex.matcher("bbb.properties").matches();
assert regex.matcher("subdir1/abc.properties").matches();
assert !regex.matcher("subdir2/subdir1/abc.properties").matches();
assert !regex.matcher("subdir1/abc.properties/foo").matches();
regex = assertIncludePatternRegex("*/*/*.properties", "[^/]*/[^/]*/[^/]*\\.properties",
"aaa/bbb/ccc.properties");
assert !regex.matcher("aaa/bbb/cccXproperties").matches() : "should not have matched, is the . escaped?";
assert !regex.matcher("ccc.properties").matches();
assert !regex.matcher("bbb/ccc.properties").matches();
assert !regex.matcher("toomany/aaa/bbb/ccc.properties").matches();
assert !regex.matcher("aaa/bbb/ccc.properties/foo").matches();
// ** = any level, including root level
regex = assertIncludePatternRegex("**/*.properties", ".*[^/]*\\.properties", "aaa/bbb/ccc.properties");
assert !regex.matcher("aaa/bbb/cccXproperties").matches() : "should not have matched, is the . escaped?";
assert regex.matcher("bbb.properties").matches();
assert regex.matcher("subdir1/abc.properties").matches();
assert regex.matcher("subdir2/subdir1/abc.properties").matches();
assert !regex.matcher("subdir1/abc.properties/foo").matches();
regex = assertIncludePatternRegex("abc/**/*.properties", "abc/.*[^/]*\\.properties", "abc/aaa/bbb.properties");
assert !regex.matcher("abc/aaa/bbbXproperties").matches() : "should not have matched, is the . escaped?";
assert !regex.matcher("bbb.properties").matches();
assert regex.matcher("abc/aaa.properties").matches();
assert regex.matcher("abc/aaa/bbb/ccc.properties").matches();
assert !regex.matcher("abc/aaa/bbb/ccc.properties/foo").matches();
regex = assertIncludePatternRegex("abc/**/xyz/*.properties", "abc/.*xyz/[^/]*\\.properties",
"abc/aaa/xyz/bbb.properties");
assert !regex.matcher("abc/aaa/xyz/bbbXproperties").matches() : "should not have matched, is the . escaped?";
assert !regex.matcher("bbb.properties").matches();
assert regex.matcher("abc/xyz/ccc.properties").matches();
assert regex.matcher("abc/aaa/bbb/xyz/ccc.properties").matches();
assert !regex.matcher("abc/aaa/bbb/xyz/ccc.properties/foo").matches();
}
/**
* @param patternToTest the include pattern to test - this is the string in the ant script like "*.properties"
* @param expectedRegex this is the regex pattern that we expect to result from the patternToTest
* @param valueToTest this is a value that should match the expectedRegex
* @return the compiled Pattern, for further testing by the caller
*/
private Pattern assertIncludePatternRegex(String patternToTest, String expectedRegex, String valueToTest) {
StringBuilder regex = new StringBuilder();
AbstractBundleType.buildIncludePatternRegex(patternToTest, regex);
assert regex.toString().equals(expectedRegex) : "Tested={" + patternToTest + "}; Expected={" + expectedRegex
+ "}; Actual={" + regex + "}";
assert Pattern.compile(regex.toString()).matcher(valueToTest).matches() : "The ExpectedRegex {" + expectedRegex
+ "} did not match the ValueToTest {" + valueToTest + "} - this unit test does not appear valid";
return Pattern.compile(regex.toString());
}
}