blob: 0379767d93a077d59879633ab16bb4d73fb5bedc [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.logging.log4j.core.appender.rolling.action;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import org.apache.logging.log4j.categories.Scripts;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.DefaultConfiguration;
import org.apache.logging.log4j.core.script.Script;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import static org.junit.Assert.*;
/**
* Tests the ScriptCondition class.
*/
public class ScriptConditionTest {
@Test(expected = NullPointerException.class)
public void testConstructorDisallowsNullScript() {
new ScriptCondition(null, new DefaultConfiguration());
}
@Test(expected = NullPointerException.class)
public void testConstructorDisallowsNullConfig() {
new ScriptCondition(new Script("test", "js", "print('hi')"), null);
}
@Test
public void testCreateConditionReturnsNullForNullScript() {
assertNull(ScriptCondition.createCondition(null, new DefaultConfiguration()));
}
@Test(expected = NullPointerException.class)
public void testCreateConditionDisallowsNullConfig() {
ScriptCondition.createCondition(new Script("test", "js", "print('hi')"), null);
}
@Test
public void testSelectFilesToDelete() {
final Configuration config = new DefaultConfiguration();
config.initialize(); // creates the ScriptManager
final Script script = new Script("test", "javascript", "pathList;"); // script that returns pathList
final ScriptCondition condition = new ScriptCondition(script, config);
final List<PathWithAttributes> pathList = new ArrayList<>();
final Path base = Paths.get("baseDirectory");
final List<PathWithAttributes> result = condition.selectFilesToDelete(base, pathList);
assertSame(result, pathList);
}
@Test
public void testSelectFilesToDelete2() {
final Configuration config = new DefaultConfiguration();
config.initialize(); // creates the ScriptManager
final List<PathWithAttributes> pathList = new ArrayList<>();
pathList.add(new PathWithAttributes(Paths.get("/path/1"), new DummyFileAttributes()));
pathList.add(new PathWithAttributes(Paths.get("/path/2"), new DummyFileAttributes()));
pathList.add(new PathWithAttributes(Paths.get("/path/3"), new DummyFileAttributes()));
final String scriptText = "pathList.remove(1);" //
+ "pathList;";
final Script script = new Script("test", "javascript", scriptText);
final ScriptCondition condition = new ScriptCondition(script, config);
final Path base = Paths.get("baseDirectory");
final List<PathWithAttributes> result = condition.selectFilesToDelete(base, pathList);
assertSame(result, pathList);
assertEquals(2, result.size());
assertEquals(Paths.get("/path/1"), result.get(0).getPath());
assertEquals(Paths.get("/path/3"), result.get(1).getPath());
}
@Test
@Category(Scripts.Groovy.class)
public void testSelectFilesToDelete3() {
final Configuration config = new DefaultConfiguration();
config.initialize(); // creates the ScriptManager
final List<PathWithAttributes> pathList = new ArrayList<>();
pathList.add(new PathWithAttributes(Paths.get("/path/1/abc/a.txt"), new DummyFileAttributes()));
pathList.add(new PathWithAttributes(Paths.get("/path/2/abc/bbb.txt"), new DummyFileAttributes()));
pathList.add(new PathWithAttributes(Paths.get("/path/3/abc/c.txt"), new DummyFileAttributes()));
final String scriptText = "" //
+ "import java.nio.file.*;" //
+ "def pattern = ~/(\\d*)[\\/\\\\]abc[\\/\\\\].*\\.txt/;" //
+ "assert pattern.getClass() == java.util.regex.Pattern;" //
+ "def copy = pathList.collect{it};"
+ "pathList.each { pathWithAttribs -> \n" //
+ " def relative = basePath.relativize pathWithAttribs.path;" //
+ " println 'relative path: ' + relative;" //
+ " def str = relative.toString();"
+ " def m = pattern.matcher(str);" //
+ " if (m.find()) {" //
+ " def index = m.group(1) as int;" //
+ " println 'extracted index: ' + index;" //
+ " def isOdd = (index % 2) == 1;"
+ " println 'is odd: ' + isOdd;" //
+ " if (isOdd) { copy.remove pathWithAttribs}"
+ " }" //
+ "}" //
+ "println copy;"
+ "copy;";
final Script script = new Script("test", "groovy", scriptText);
final ScriptCondition condition = new ScriptCondition(script, config);
final Path base = Paths.get("/path");
final List<PathWithAttributes> result = condition.selectFilesToDelete(base, pathList);
assertEquals(1, result.size());
assertEquals(Paths.get("/path/2/abc/bbb.txt"), result.get(0).getPath());
}
}