/*
* Copyright 2000-2011 JetBrains s.r.o.
*
* 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 jetbrains.buildServer.tools.test;
import jetbrains.buildServer.tools.ScanFile;
import jetbrains.buildServer.tools.java.JavaVersion;
import jetbrains.buildServer.tools.rules.CheckHolder;
import jetbrains.buildServer.tools.rules.PathSettings;
import jetbrains.buildServer.tools.rules.StaticCheckRule;
import jetbrains.buildServer.tools.rules.VersionRule;
import org.jetbrains.annotations.Nullable;
import org.testng.Assert;
import org.testng.annotations.Test;
import java.io.IOException;
import java.util.Collection;
import static jetbrains.buildServer.tools.java.JavaVersion.Java_1_7;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertNull;
/**
* @author Eugene Petrenko (eugene.petrenko@gmail.com)
* Date: 11.11.11 15:33
*/
public class RulesMatcherTest extends RulesBaseTestCase {
@Test
public void testMatchesFile() throws IOException {
final PathSettings s = parseConfig("1.7 => aaa/bbb.jar\r\n-=>aaa/z");
assertEquals(getVersionRule(s, mockFile("aaa/bbb.jar")), Java_1_7);
assertEquals(getVersionRule(s, mockFile("aaa/bbb.jar!aaa")), Java_1_7);
assertEquals(getVersionRule(s, mockFile("aaa/bbb.jar!aaa/bbb")), Java_1_7);
assertEquals(getVersionRule(s, mockFile("aaa/bbb.jar!aaa/bbb.jar!zzz")), Java_1_7);
assertEquals(getVersionRule(s, mockFile("aaa/zzz.jar")), null);
assertEquals(getVersionRule(s, mockFile("aaa")), null);
}
@Test
public void testMatchesWildcard() throws IOException {
final PathSettings s = parseConfig("1.7 => aaa/*/bbb\r\n1.7 => aaa/*!bbb\r\n-=>aaa/*/bbb/z");
assertEquals(getVersionRule(s, mockFile("aaa/x1/bbb/ccc.jar")), Java_1_7);
assertEquals(getVersionRule(s, mockFile("aaa/x2/bbb/ccc.jar!aaa/ppp.jar!mmm")), Java_1_7);
assertEquals(getVersionRule(s, mockFile("aaa/x3/bbb.jar!aaa/bbb.jar!zzz")), Java_1_7);
assertEquals(getVersionRule(s, mockFile("aaa/x2.zip!bbb/ccc.jar!aaa/ppp.jar!mmm")), Java_1_7);
assertEquals(getVersionRule(s, mockFile("aaa/x1/bbb/z")), null);
}
@Test
public void testExcludes() throws IOException {
final PathSettings s = parseConfig("1.7 => aaa/bbb.jar\r\n-=>aaa/b");
Assert.assertTrue(isPathExcluded(s, mockFile("aaa/b")));
Assert.assertTrue(isPathExcluded(s, mockFile("aaa/bb")));
Assert.assertTrue(isPathExcluded(s, mockFile("aaa/bbq")));
Assert.assertTrue(isPathUnknown(s, mockFile("ppp/bbq")));
//excludes wins no more
Assert.assertFalse(isPathExcluded(s, mockFile("aaa/bbb.jar")));
Assert.assertFalse(isPathExcluded(s, mockFile("aaa/bbb.jar!sss")));
}
private boolean isPathUnknown(PathSettings s, ScanFile f) {
return s.getFileCheckMode(f) == null;
}
private boolean isPathExcluded(PathSettings s, ScanFile f) {
final Collection<? extends CheckHolder> mode = s.getFileCheckMode(f);
return mode != null && mode.isEmpty();
}
@Nullable
private JavaVersion getVersionRule(PathSettings s, ScanFile f) {
final Collection<? extends CheckHolder> mode = s.getFileCheckMode(f);
if (mode == null) return null;
for (CheckHolder holder : mode) {
if (holder instanceof VersionRule) {
return ((VersionRule) holder).getVersion();
}
}
return null;
}
@Nullable
private StaticCheckRule getStaticRule(PathSettings s, ScanFile f) {
final Collection<? extends CheckHolder> mode = s.getFileCheckMode(f);
if (mode == null) return null;
for (CheckHolder holder : mode) {
if (holder instanceof StaticCheckRule) {
return ((StaticCheckRule) holder);
}
}
return null;
}
@Test
public void testLongestRuleWins() throws IOException {
final PathSettings s = parseConfig("1.7 => aaa/bbb/ccc/ddd.jar\r\n1.2=>");
assertEquals(getVersionRule(s, mockFile("aaa")), JavaVersion.Java_1_2);
assertEquals(getVersionRule(s, mockFile("aaa/bbb.jar")), JavaVersion.Java_1_2);
assertEquals(getVersionRule(s, mockFile("aaa/bbb.jar!aaa")), JavaVersion.Java_1_2);
assertEquals(getVersionRule(s, mockFile("aaa/bbb/bbb.jar!aaa/bbb")), JavaVersion.Java_1_2);
assertEquals(getVersionRule(s, mockFile("aaa/bbb/ccc/bbb.jar!aaa/bbb")), JavaVersion.Java_1_2);
assertEquals(getVersionRule(s, mockFile("aaa/bbb/ccc/ddd/bbb.jar!aaa/bbb")), JavaVersion.Java_1_2);
assertEquals(getVersionRule(s, mockFile("aaa/bbb.jar!aaa/bbb.jar!zzz")), JavaVersion.Java_1_2);
assertEquals(getVersionRule(s, mockFile("aaa/bbb/ccc/ddd.jar!aaa/bbb.jar!zzz")), Java_1_7);
assertEquals(getVersionRule(s, mockFile("aaa/bbb/ccc/ddd.jar")), Java_1_7);
assertEquals(getVersionRule(s, mockFile("aaa/bbb/ccc/ddd.jarddd")), Java_1_7);
assertEquals(getVersionRule(s, mockFile("aaa/bbb/ccc/ddd.jar!e/d/sd")), Java_1_7);
}
@Test
public void testWildcardRuleLose() throws IOException {
final PathSettings s = parseConfig("1.8 => \r\n1.7 => aaa/*/bbbbb\r\n1.6 => aaa/ccc/");
assertEquals(getVersionRule(s, mockFile("aaa/yyy/bbbbb/k.jar")), JavaVersion.Java_1_7);
assertEquals(getVersionRule(s, mockFile("aaa/ccc/bbbbb/k.jar")), JavaVersion.Java_1_6);
}
@Test
public void testStaticRules() throws IOException {
final PathSettings s = parseConfig("check static => aaa/bbb/ccc/ddd.jar\n - check static => aaa/bbb/ccc/ddd.jar!z");
assertNull(getStaticRule(s, mockFile("aaa")));
assertNull(getStaticRule(s, mockFile("aaa/bbb.jar")));
assertNull(getStaticRule(s, mockFile("aaa/bbb.jar!aaa")));
assertNull(getStaticRule(s, mockFile("aaa/bbb/bbb.jar!aaa/bbb")));
assertNull(getStaticRule(s, mockFile("aaa/bbb/ccc/bbb.jar!aaa/bbb")));
assertNull(getStaticRule(s, mockFile("aaa/bbb/ccc/ddd/bbb.jar!aaa/bbb")));
assertNull(getStaticRule(s, mockFile("aaa/bbb.jar!aaa/bbb.jar!zzz")));
assertNotNull(getStaticRule(s, mockFile("aaa/bbb/ccc/ddd.jar!aaa/bbb.jar!zzz")));
assertNotNull(getStaticRule(s, mockFile("aaa/bbb/ccc/ddd.jar!aaa/bbb.jar!zzz.class")));
assertNotNull(getStaticRule(s, mockFile("aaa/bbb/ccc/ddd.jar")));
assertNotNull(getStaticRule(s, mockFile("aaa/bbb/ccc/ddd.jarddd")));
assertNotNull(getStaticRule(s, mockFile("aaa/bbb/ccc/ddd.jar!e/d/sd")));
assertNull(getStaticRule(s, mockFile("aaa/bbb/ccc/ddd.jar!zzz")));
}
@Test
public void testStaticExcludeRulesSimple() throws IOException {
final PathSettings s = parseConfig("check static => aaa/bbb.jar\n - check static => aaa");
assertNull(getStaticRule(s, mockFile("aaa")));
assertNotNull(getStaticRule(s, mockFile("aaa/bbb.jar")));
}
@Test
public void testStaticExcludeRulesSimple2() throws IOException {
final PathSettings s = parseConfig("- check static => aaa\ncheck static => aaa/bbb.jar");
assertNull(getStaticRule(s, mockFile("aaa")));
assertNotNull(getStaticRule(s, mockFile("aaa/bbb.jar")));
}
@Test
public void testStaticExcludeRulesWithHierarchyIgnoreOrder() throws IOException {
final String[] source = new String[]{"check static => ", "- check static => aaa", "check static => aaa/bbb.jar"};
int[][] variants = new int[][]{{0, 1, 2}, {0, 2, 1}, {1, 0, 2}, {1, 2, 0}, {2, 0, 1}, {2, 1, 0}};
for (int[] variant : variants) {
assertEquals(variant.length, source.length);
final String config = source[variant[0]] + '\n' + source[variant[1]] + '\n' + source[variant[2]];
final PathSettings s = parseConfig(config);
assertNotNull(getStaticRule(s, mockFile("")));
assertNull(getStaticRule(s, mockFile("aaa")));
assertNotNull(getStaticRule(s, mockFile("aaa/bbb.jar")));
}
}
@Test
public void testStaticExcludeRulesWithHierarchyIgnoreOrder2() throws IOException {
final String[] source = new String[]{"check static => aaa", "- check static => aaa/bbb.jar", "check static => aaa/bbb.jar!/a.class"};
int[][] variants = new int[][]{{0, 1, 2}, {0, 2, 1}, {1, 0, 2}, {1, 2, 0}, {2, 0, 1}, {2, 1, 0}};
for (int[] variant : variants) {
assertEquals(variant.length, source.length);
final String config = source[variant[0]] + '\n' + source[variant[1]] + '\n' + source[variant[2]];
final PathSettings s = parseConfig(config);
assertNull(getStaticRule(s, mockFile("")));
assertNotNull(getStaticRule(s, mockFile("aaa")));
assertNull(getStaticRule(s, mockFile("aaa/bbb.jar")));
assertNotNull(getStaticRule(s, mockFile("aaa/bbb.jar!/a.class")));
}
}
}