Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RAT-98: Changes to tests for multi OS and FileDocument change #441

Merged
merged 3 commits into from
Feb 8, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ public void archiveProcessingTest(ReportConfiguration.Processing archiveProcessi

@Test
public void missingFileTest() {
final Document document = new FileDocument(
final Document document = new FileDocument(basedir,
new File(Resources.getExampleResource("exampleData"), "not_a_real_file"), DocumentNameMatcher.MATCHES_ALL);
Defaults defaults = Defaults.builder().build();
ReportConfiguration config = new ReportConfiguration();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,14 @@
*/
package org.apache.rat.config.exclusion;

import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;
import org.apache.commons.io.FileUtils;
import org.apache.rat.document.DocumentNameMatcher;
import org.apache.rat.document.DocumentName;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;

import java.io.File;
Expand All @@ -31,26 +34,26 @@
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;
import org.mockito.Mockito;

import static java.lang.String.format;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Fail.fail;
import static org.apache.rat.document.FSInfoTest.OSX;
import static org.apache.rat.document.FSInfoTest.UNIX;
import static org.apache.rat.document.FSInfoTest.WINDOWS;

public class ExclusionProcessorTest {

final private static DocumentNameMatcher TRUE = DocumentNameMatcher.MATCHES_ALL;
final private static DocumentNameMatcher FALSE = DocumentNameMatcher.MATCHES_NONE;
/** The base directory for the test. */
@TempDir
private File basedirFile;
private DocumentName basedir;

@BeforeEach
public void setup() {
basedir = DocumentName.builder(basedirFile).build();
}
@TempDir
private static Path tempDir;

private void testParseExclusion(DocumentNameMatcher nameMatcher, DocumentName name, boolean expected) {
private void testParseExclusion(DocumentName basedir, DocumentNameMatcher nameMatcher, DocumentName name, boolean expected) {
assertThat(nameMatcher.matches(name)).as(() -> format("Failed on [%s %s]%n%s", basedir, name, dump(nameMatcher, name))).isEqualTo(expected);
}

Expand All @@ -60,48 +63,63 @@ private String dump(DocumentNameMatcher nameMatcher, DocumentName name) {
return sb.toString();
}

private DocumentName mkName(String pth) {
File f = new File(basedirFile, pth);
try {
FileUtils.cleanDirectory(basedirFile);
FileUtils.touch(f);
} catch (IOException e) {
fail(e);
private DocumentName mkName(DocumentName baseDir, String pth) throws IOException {
DocumentName result = baseDir.resolve(ExclusionUtils.convertSeparator(pth, "/", baseDir.getDirectorySeparator()));
DocumentName mocked = Mockito.spy(result);

String fn = result.localized(FileSystems.getDefault().getSeparator());
File file = tempDir.resolve(fn.substring(1)).toFile();
File parent = file.getParentFile();
if (parent.exists() && !parent.isDirectory()) {
parent.delete();
}
return DocumentName.builder(f).setBaseName(basedir.getBaseName()).build();
parent.mkdirs();
if (file.exists()) {
if (file.isDirectory()) {
FileUtils.deleteDirectory(file);
} else {
FileUtils.delete(file);
}
}
file.createNewFile();
Mockito.when(mocked.asFile()).thenReturn(file);
return mocked;
}

@Test
public void defaultTest() {
@ParameterizedTest
@MethodSource("getDocumentNames")
void defaultTest(DocumentName basedir) throws IOException {
ExclusionProcessor p = new ExclusionProcessor();
testParseExclusion(p.getNameMatcher(basedir), mkName("hello"), true);
testParseExclusion(basedir, p.getNameMatcher(basedir), mkName(basedir, "hello"), true);
}

@Test
public void addExcludedCollectionTest() {
@ParameterizedTest
@MethodSource("getDocumentNames")
void addExcludedCollectionTest(DocumentName basedir) throws IOException {
ExclusionProcessor p = new ExclusionProcessor().addExcludedCollection(StandardCollection.MISC);
// "**/*~", "**/#*#", "**/.#*", "**/%*%", "**/._*"
testParseExclusion(p.getNameMatcher(basedir), mkName("hello"), true);
testParseExclusion(p.getNameMatcher(basedir), mkName("hello~"), false);
testParseExclusion(p.getNameMatcher(basedir), mkName("#hello#"), false);
testParseExclusion(p.getNameMatcher(basedir), mkName(".#hello"), false);
testParseExclusion(p.getNameMatcher(basedir), mkName("%hello%"), false);
testParseExclusion(p.getNameMatcher(basedir), mkName("._hello"), false);
testParseExclusion(basedir, p.getNameMatcher(basedir), mkName(basedir,"hello"), true);
testParseExclusion(basedir, p.getNameMatcher(basedir), mkName(basedir,"hello~"), false);
testParseExclusion(basedir, p.getNameMatcher(basedir), mkName(basedir, "#hello#"), false);
testParseExclusion(basedir, p.getNameMatcher(basedir), mkName(basedir, ".#hello"), false);
testParseExclusion(basedir, p.getNameMatcher(basedir), mkName(basedir, "%hello%"), false);
testParseExclusion(basedir, p.getNameMatcher(basedir), mkName(basedir, "._hello"), false);
}

@Test
public void addExcludedAndIncludedCollectionTest() {
@ParameterizedTest
@MethodSource("getDocumentNames")
void addExcludedAndIncludedCollectionTest(DocumentName basedir) throws IOException {
ExclusionProcessor p = new ExclusionProcessor().addExcludedCollection(StandardCollection.MISC)
.addIncludedCollection(StandardCollection.HIDDEN_FILE);
testParseExclusion(p.getNameMatcher(basedir), mkName("hello"), true);
testParseExclusion(p.getNameMatcher(basedir), mkName("hello~"), false);
testParseExclusion(p.getNameMatcher(basedir), mkName("#hello#"), false);
testParseExclusion(p.getNameMatcher(basedir), mkName(".#hello"), true);
testParseExclusion(p.getNameMatcher(basedir), mkName("%hello%"), false);
testParseExclusion(p.getNameMatcher(basedir), mkName("._hello"), true);
testParseExclusion(basedir, p.getNameMatcher(basedir), mkName(basedir,"hello"), true);
testParseExclusion(basedir, p.getNameMatcher(basedir), mkName(basedir, "hello~"), false);
testParseExclusion(basedir, p.getNameMatcher(basedir), mkName(basedir, "#hello#"), false);
testParseExclusion(basedir, p.getNameMatcher(basedir), mkName(basedir, ".#hello"), true);
testParseExclusion(basedir, p.getNameMatcher(basedir), mkName(basedir, "%hello%"), false);
testParseExclusion(basedir, p.getNameMatcher(basedir), mkName(basedir, "._hello"), true);
}

private void assertExclusions(String pattern, Map<String,Boolean> expectedMap) {
private void assertExclusions(DocumentName basedir, String pattern, Map<String,Boolean> expectedMap) throws IOException {
String[] paths = {"a/b/foo", "b/foo", "foo", "foo/x", "foo/x/y", "b/foo/x",
"b/foo/x/y", "a/b/foo/x", "a/b/foo/x/y"};
ExclusionProcessor p = new ExclusionProcessor().addExcludedPatterns(Collections.singletonList(pattern));
Expand All @@ -111,13 +129,13 @@ private void assertExclusions(String pattern, Map<String,Boolean> expectedMap) {
if (expected == null) {
throw new RuntimeException("Missing expected value for " + pth + " in pattern " + pattern);
}
DocumentName dn = mkName(pth);
testParseExclusion(pathMatcher, mkName(pth), expected);
testParseExclusion(basedir, pathMatcher, mkName(basedir, pth), expected);
}
}

@Test
public void addExcludedPatternsTest() {
@ParameterizedTest
@MethodSource("getDocumentNames")
void addExcludedPatternsTest(DocumentName basedir) throws IOException {
Map<String,Boolean> expectedMap = new HashMap<>();

expectedMap.put("a/b/foo", true);
Expand All @@ -129,7 +147,7 @@ public void addExcludedPatternsTest() {
expectedMap.put("b/foo/x/y", true);
expectedMap.put("a/b/foo/x", true);
expectedMap.put("a/b/foo/x/y",true);
assertExclusions("foo", expectedMap);
assertExclusions(basedir, "foo", expectedMap);

expectedMap.clear();
expectedMap.put("a/b/foo", true);
Expand All @@ -141,7 +159,7 @@ public void addExcludedPatternsTest() {
expectedMap.put("b/foo/x/y", true);
expectedMap.put("a/b/foo/x", true);
expectedMap.put("a/b/foo/x/y",true);
assertExclusions("foo/*", expectedMap);
assertExclusions(basedir, "foo/*", expectedMap);

expectedMap.clear();
expectedMap.put("a/b/foo", true);
Expand All @@ -153,7 +171,7 @@ public void addExcludedPatternsTest() {
expectedMap.put("b/foo/x/y", true);
expectedMap.put("a/b/foo/x", true);
expectedMap.put("a/b/foo/x/y",true);
assertExclusions("foo/**", expectedMap);
assertExclusions(basedir, "foo/**", expectedMap);

expectedMap.clear();
expectedMap.put("a/b/foo", true);
Expand All @@ -165,7 +183,7 @@ public void addExcludedPatternsTest() {
expectedMap.put("b/foo/x/y", true);
expectedMap.put("a/b/foo/x", true);
expectedMap.put("a/b/foo/x/y",true);
assertExclusions("*/foo", expectedMap);
assertExclusions(basedir, "*/foo", expectedMap);

expectedMap.clear();
expectedMap.put("a/b/foo", true);
Expand All @@ -177,7 +195,7 @@ public void addExcludedPatternsTest() {
expectedMap.put("b/foo/x/y", true);
expectedMap.put("a/b/foo/x", true);
expectedMap.put("a/b/foo/x/y",true);
assertExclusions("*/foo/*", expectedMap);
assertExclusions(basedir, "*/foo/*", expectedMap);

expectedMap.clear();
expectedMap.put("a/b/foo", true);
Expand All @@ -189,7 +207,7 @@ public void addExcludedPatternsTest() {
expectedMap.put("b/foo/x/y", false);
expectedMap.put("a/b/foo/x", true);
expectedMap.put("a/b/foo/x/y",true);
assertExclusions("*/foo/**", expectedMap);
assertExclusions(basedir, "*/foo/**", expectedMap);

expectedMap.clear();
expectedMap.put("a/b/foo", false);
Expand All @@ -201,7 +219,7 @@ public void addExcludedPatternsTest() {
expectedMap.put("b/foo/x/y", true);
expectedMap.put("a/b/foo/x", true);
expectedMap.put("a/b/foo/x/y",true);
assertExclusions("**/foo", expectedMap);
assertExclusions(basedir, "**/foo", expectedMap);

expectedMap.clear();
expectedMap.put("a/b/foo", true);
Expand All @@ -213,7 +231,7 @@ public void addExcludedPatternsTest() {
expectedMap.put("b/foo/x/y", true);
expectedMap.put("a/b/foo/x", false);
expectedMap.put("a/b/foo/x/y",true);
assertExclusions("**/foo/*", expectedMap);
assertExclusions(basedir, "**/foo/*", expectedMap);

expectedMap.clear();
expectedMap.put("a/b/foo", false);
Expand All @@ -225,31 +243,52 @@ public void addExcludedPatternsTest() {
expectedMap.put("b/foo/x/y", false);
expectedMap.put("a/b/foo/x", false);
expectedMap.put("a/b/foo/x/y",false);
assertExclusions("**/foo/**", expectedMap);
assertExclusions(basedir, "**/foo/**", expectedMap);
}

@Test
public void orTest() {
@ParameterizedTest
@MethodSource("getDocumentNames")
void orTest(DocumentName basedir) {
ExclusionProcessor underTest = new ExclusionProcessor();
assertThat(DocumentNameMatcher.or(Arrays.asList(TRUE, FALSE)).matches(basedir)).isTrue();
assertThat(DocumentNameMatcher.or(Arrays.asList(FALSE, TRUE)).matches(basedir)).isTrue();
assertThat(DocumentNameMatcher.or(Arrays.asList(TRUE, TRUE)).matches(basedir)).isTrue();
assertThat(DocumentNameMatcher.or(Arrays.asList(FALSE, FALSE)).matches(basedir)).isFalse();
}

@Test
public void andTest() {
@ParameterizedTest
@MethodSource("getDocumentNames")
void andTest(DocumentName basedir) {
ExclusionProcessor underTest = new ExclusionProcessor();
assertThat(DocumentNameMatcher.and(TRUE, FALSE).matches(basedir)).isFalse();
assertThat(DocumentNameMatcher.and(FALSE, TRUE).matches(basedir)).isFalse();
assertThat(DocumentNameMatcher.and(TRUE, TRUE).matches(basedir)).isTrue();
assertThat(DocumentNameMatcher.and(FALSE, FALSE).matches(basedir)).isFalse();
}

@Test
public void notTest() {
@ParameterizedTest
@MethodSource("getDocumentNames")
void notTest(DocumentName basedir) {
ExclusionProcessor underTest = new ExclusionProcessor();
assertThat(DocumentNameMatcher.not(TRUE).matches(basedir)).isFalse();
assertThat(DocumentNameMatcher.not(FALSE).matches(basedir)).isTrue();
}

private static Stream<Arguments> getDocumentNames() {
List<Arguments> lst = new ArrayList<>();

DocumentName.Builder builder = DocumentName.builder().setName("default");
lst.add(Arguments.of(builder.setBaseName(builder.directorySeparator()).build()));

builder = DocumentName.builder(WINDOWS).setName("windows");
lst.add(Arguments.of(builder.setBaseName(builder.directorySeparator()).build()));

builder = DocumentName.builder(UNIX).setName("unix");
lst.add(Arguments.of(builder.setBaseName(builder.directorySeparator()).build()));

builder = DocumentName.builder(OSX).setName("osx");
lst.add(Arguments.of(builder.setBaseName(builder.directorySeparator()).build()));

return lst.stream();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,15 @@
import java.util.List;
import java.util.stream.Stream;
import org.apache.rat.document.DocumentName;
import org.apache.rat.document.FSInfoTest;
import org.apache.rat.testhelpers.TestingDocument;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.apache.rat.document.FSInfoTest.OSX;
import static org.apache.rat.document.FSInfoTest.UNIX;
import static org.apache.rat.document.FSInfoTest.WINDOWS;

public class NoteGuesserTest {

Expand All @@ -42,8 +44,9 @@ public void testMatches(DocumentName testingName, boolean expected) {
private static Stream<Arguments> nameData() {
List<Arguments> lst = new ArrayList<>();

final DocumentName linuxBaseName = DocumentName.builder(FSInfoTest.UNIX).setName("/").setBaseName("/").build();
final DocumentName windowsBaseName = DocumentName.builder(FSInfoTest.WINDOWS).setName("\\").setBaseName("\\").build();
final DocumentName osxBaseName = DocumentName.builder(OSX).setName("/").setBaseName("/").build();
final DocumentName linuxBaseName = DocumentName.builder(UNIX).setName("/").setBaseName("/").build();
final DocumentName windowsBaseName = DocumentName.builder(WINDOWS).setName("\\").setBaseName("\\").build();

lst.add(Arguments.of(linuxBaseName.resolve("DEPENDENCIES"), true));
lst.add(Arguments.of(linuxBaseName.resolve("LICENSE"), true));
Expand Down Expand Up @@ -77,6 +80,22 @@ private static Stream<Arguments> nameData() {
lst.add(Arguments.of(windowsBaseName.resolve("src\\test\\README.txt"), true));
lst.add(Arguments.of(windowsBaseName.resolve("src\\test\\README.shouldFail"), false));

lst.add(Arguments.of(osxBaseName.resolve("DEPENDENCIES"), true));
lst.add(Arguments.of(osxBaseName.resolve("LICENSE"), true));
lst.add(Arguments.of(osxBaseName.resolve("LICENSE.txt"), true));
lst.add(Arguments.of(osxBaseName.resolve("NOTICE"), true));
lst.add(Arguments.of(osxBaseName.resolve("NOTICE.txt"), true));
lst.add(Arguments.of(osxBaseName.resolve("README"), true));
lst.add(Arguments.of(osxBaseName.resolve("README.txt"), true));
lst.add(Arguments.of(osxBaseName.resolve("src/test/DEPENDENCIES"), true));
lst.add(Arguments.of(osxBaseName.resolve("src/test/LICENSE"), true));
lst.add(Arguments.of(osxBaseName.resolve("src/test/LICENSE.txt"), true));
lst.add(Arguments.of(osxBaseName.resolve("src/test/NOTICE"), true));
lst.add(Arguments.of(osxBaseName.resolve("src/test/NOTICE.txt"), true));
lst.add(Arguments.of(osxBaseName.resolve("src/test/README"), true));
lst.add(Arguments.of(osxBaseName.resolve("src/test/README.txt"), true));
lst.add(Arguments.of(osxBaseName.resolve("src/test/README.shouldFail"), false));

return lst.stream();
}
}
Loading