All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.gradle.api.internal.file.collections.DefaultDirectoryWalkerTest.groovy Maven / Gradle / Ivy

/*
 * Copyright 2010 the original author or authors.
 *
 * 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 org.gradle.api.internal.file.collections

import org.gradle.api.file.FileVisitDetails
import org.gradle.api.file.FileVisitor
import org.gradle.api.internal.file.TestFiles
import org.gradle.api.specs.Spec
import org.gradle.api.tasks.util.PatternSet
import org.gradle.internal.Factory
import org.gradle.test.fixtures.AbstractProjectBuilderSpec

class DefaultDirectoryWalkerTest extends AbstractProjectBuilderSpec {
    def directoryWalkerFactory = new Factory() {
        def directoryWalker = new DefaultDirectoryWalker(TestFiles.fileSystem())

        @Override
        public DirectoryWalker create() {
            return directoryWalker
        }
    }
    private TestVisitor visitor

    def setup () {
        visitor = new TestVisitor()
    }

    def rootDirEmpty() {
        given:
        def root = temporaryFolder.createDir("root")
        def fileTree = new DirectoryFileTree(root, new PatternSet(), directoryWalkerFactory, TestFiles.fileSystem(), false)

        when:
        fileTree.visit(visitor)

        then:
        visitor.assertExpectations()
    }

    def testUsesSpecFromPatternSetToMatchFilesAndDirs() {
        given:
        def spec = Mock(Spec)
        def patternSet = Mock(PatternSet)
        def fileTree = new DirectoryFileTree(new File("root"), patternSet, directoryWalkerFactory, TestFiles.fileSystem(), false)

        when:
        fileTree.visit(visitor)

        then:
        1 * patternSet.getAsSpec() >> spec
        visitor.assertExpectations()
    }

    def walkSingleFile() {
        given:
        def root = temporaryFolder.createDir("root")
        def fileToCopy = root.createFile("file.txt")
        def fileTree = new DirectoryFileTree(fileToCopy, new PatternSet(), directoryWalkerFactory, TestFiles.fileSystem(), false)

        when:
        visitor.setExpectedVisitations([[fileToCopy]])
        fileTree.visit(visitor)

        then:
        visitor.assertExpectations()
    }

    /*
    file structure:
    root
        rootFile1
        dir1
           dirFile1
           dirFile2
        rootFile2

        Test that the files are really walked breadth first
     */
    def walkBreadthFirst() {
        given:
        def root = temporaryFolder.createDir("root")
        def rootFile1 = root.createFile("rootFile1")
        def dir1 = root.createDir("dir1")
        def dirFile1 = dir1.createFile("dirFile1")
        def dirFile2 = dir1.createFile("dirFile2")
        def rootFile2 = root.createFile("rootFile2")

        def fileTree = new DirectoryFileTree(root, new PatternSet(), directoryWalkerFactory, TestFiles.fileSystem(), false)

        when:
        visitor.setExpectedVisitations([[rootFile1, rootFile2], [dir1], [dirFile1, dirFile2]])
        fileTree.visit(visitor)

        then:
        visitor.assertExpectations()
    }

    def walkDepthFirst() {
        given:
        def root = temporaryFolder.createDir("root")
        def rootFile1 = root.createFile("rootFile1")
        def dir1 = root.createDir("dir1")
        def dirFile1 = dir1.createFile("dirFile1")
        def dirFile2 = dir1.createFile("dirFile2")
        def rootFile2 = root.createFile("rootFile2")

        def fileTree = new DirectoryFileTree(root, new PatternSet(), directoryWalkerFactory, TestFiles.fileSystem(), false).postfix()

        when:
        visitor.setExpectedVisitations([[rootFile1, rootFile2], [dirFile2, dirFile1], [dir1]])
        fileTree.visit(visitor)

        then:
        visitor.assertExpectations()
    }

    def canApplyFilter() {
        given:
        def root = temporaryFolder.createDir("root")
        root.createFile("rootFile1")
        def dir1 = root.createDir("dir1")
        dir1.createFile("dirFile1")
        def dirFile2 = dir1.createFile("dirFile2")
        root.createFile("rootFile2")

        and:
        def patterns = new PatternSet()
        patterns.include("**/*2")
        def filter = new PatternSet()
        filter.include("dir1/**")

        and:
        DirectoryFileTree fileTree = new DirectoryFileTree(root, patterns, directoryWalkerFactory, TestFiles.fileSystem(), false).filter(filter)

        when:
        visitor.setExpectedVisitations([[dir1], [dirFile2]])
        fileTree.visit(visitor)

        then:
        visitor.assertExpectations()
    }

    def visitorCanStopVisit() {
        given:
        def root = temporaryFolder.createDir("root")
        def rootFile1 = root.createFile("rootFile1")
        def dir1 = root.createDir("dir1")
        def dirFile1 = dir1.createFile("dirFile1")
        def dirFile2 = dir1.createFile("dirFile2")
        dir1.createDir("dir1Dir").createFile("dir1Dir1File1")
        def rootFile2 = root.createFile("rootFile2")

        def fileTree = new DirectoryFileTree(root, new PatternSet(), directoryWalkerFactory, TestFiles.fileSystem(), false)

        when:
        visitor.setStopOn(rootFile1)
        visitor.setExpectedVisitations([[rootFile1, rootFile2]])
        fileTree.visit(visitor)

        then:
        visitor.assertExpectations()

        when:
        visitor = new TestVisitor()
        visitor.setStopOn(dirFile1)
        visitor.setExpectedVisitations([[rootFile1, rootFile2], [dir1], [dirFile2, dirFile1]])
        fileTree.visit(visitor)

        then:
        visitor.assertExpectations()
    }

    def canTestForFileMembership() {
        given:
        def rootDir = temporaryFolder.createDir("root")
        def rootTextFile = rootDir.file("a.txt").createFile()
        def nestedTextFile = rootDir.file("a/b/c.txt").createFile()
        def notTextFile = rootDir.file("a/b/c.html").createFile()
        def excludedFile = rootDir.file("subdir1/a/b/c.html").createFile()
        def notUnderRoot = temporaryFolder.createDir("root2").file("a.txt").createFile()
        def doesNotExist = rootDir.file("b.txt")

        when:
        def patterns = new PatternSet()
        patterns.include("**/*.txt")
        patterns.exclude("subdir1/**")
        def fileTree = new DirectoryFileTree(rootDir, patterns, directoryWalkerFactory, TestFiles.fileSystem(), false)

        then:
        fileTree.contains(rootTextFile)
        fileTree.contains(nestedTextFile)
        !fileTree.contains(notTextFile)
        !fileTree.contains(excludedFile)
        !fileTree.contains(notUnderRoot)
        !fileTree.contains(doesNotExist)
    }

    def hasUsefulDisplayName() {
        given:
        def treeWithNoIncludesOrExcludes = new DirectoryFileTree(temporaryFolder.getTestDirectory(), new PatternSet(), directoryWalkerFactory, TestFiles.fileSystem(), false)
        def includesOnly = new PatternSet()
        includesOnly.include("a/b", "c")
        def treeWithIncludes = new DirectoryFileTree(temporaryFolder.getTestDirectory(), includesOnly, directoryWalkerFactory, TestFiles.fileSystem(), false)
        def excludesOnly = new PatternSet()
        excludesOnly.exclude("a/b", "c")
        def treeWithExcludes = new DirectoryFileTree(temporaryFolder.getTestDirectory(), excludesOnly, directoryWalkerFactory, TestFiles.fileSystem(), false)

        expect:
        treeWithNoIncludesOrExcludes.getDisplayName() == "directory '${temporaryFolder.getTestDirectory()}'".toString()
        treeWithIncludes.getDisplayName() == "directory '${temporaryFolder.getTestDirectory()}' include 'a/b', 'c'".toString()
        treeWithExcludes.getDisplayName() == "directory '${temporaryFolder.getTestDirectory()}' exclude 'a/b', 'c'".toString()
    }

    private static class TestVisitor implements FileVisitor {
        // This is a list of lists. We want to confirm that files at each level
        // of the directory walk are visited while not caring about their
        // order.
        def expectedVisitations = []
        private stopOn = null

        @Override
        void visitDir(FileVisitDetails dirDetails) {
            handleDetails(dirDetails)
        }

        @Override
        void visitFile(FileVisitDetails fileDetails) {
            handleDetails(fileDetails)
        }

        private void handleDetails(FileVisitDetails details) {
            def file = details.getFile()
            assert expectedVisitations[0].contains(file)
            expectedVisitations[0].remove(file)
            if (expectedVisitations[0].isEmpty() || file == stopOn) {
                expectedVisitations.remove(0)
                if (file == stopOn) {
                    details.stopVisiting()
                }
            }
        }

        void setStopOn(File stop) {
            stopOn = stop
        }

        boolean assertExpectations() {
            assert expectedVisitations.isEmpty()
            return true
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy