/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * 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.uberfire.java.nio.file; import java.io.File; import java.util.concurrent.atomic.AtomicInteger; import org.apache.commons.io.FileUtils; import org.junit.After; import org.junit.Ignore; import org.junit.Test; import org.uberfire.java.nio.IOException; import org.uberfire.java.nio.file.attribute.BasicFileAttributes; import static org.fest.assertions.api.Assertions.assertThat; @Ignore public class FileTreeWalkerTest extends AbstractBaseTest { final AtomicInteger preDir = new AtomicInteger(); final AtomicInteger postDir = new AtomicInteger(); final AtomicInteger fileC = new AtomicInteger(); final AtomicInteger failFile = new AtomicInteger(); final FileVisitor<Path> simple = new FileVisitor<Path>() { @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { preDir.addAndGet(1); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { fileC.addAndGet(1); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { failFile.addAndGet(1); return FileVisitResult.TERMINATE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { postDir.addAndGet(1); return FileVisitResult.CONTINUE; } }; @After public void cleanup() throws java.io.IOException { for (final File file : cleanupList) { FileUtils.deleteDirectory(file); } } @Test public void testWalker() { final FileTreeWalker walker = new FileTreeWalker(simple, 1); walker.walk(Paths.get("/some/path")); assertThat(preDir.get()).isEqualTo(0); assertThat(postDir.get()).isEqualTo(0); assertThat(fileC.get()).isEqualTo(0); assertThat(failFile.get()).isEqualTo(1); final Path dir = newTempDir(null); final Path file1 = Files.createTempFile(dir, "foo", "bar"); final Path file2 = Files.createTempFile(dir, "foo", "bar"); cleanupVisitor(); walker.walk(dir); assertThat(preDir.get()).isEqualTo(1); assertThat(postDir.get()).isEqualTo(1); assertThat(fileC.get()).isEqualTo(2); assertThat(failFile.get()).isEqualTo(0); cleanupVisitor(); walker.walk(file1); assertThat(preDir.get()).isEqualTo(0); assertThat(postDir.get()).isEqualTo(0); assertThat(fileC.get()).isEqualTo(1); assertThat(failFile.get()).isEqualTo(0); } @Test public void testWalkerDeep2() { final FileTreeWalker walker = new FileTreeWalker(simple, 2); final Path dir = newTempDir(null); final Path subDir = newTempDir(dir); final Path subSubDir = newTempDir(subDir); final Path subSubSubDir = newTempDir(subSubDir); cleanupVisitor(); walker.walk(dir); assertThat(preDir.get()).isEqualTo(2); assertThat(postDir.get()).isEqualTo(2); assertThat(fileC.get()).isEqualTo(1); assertThat(failFile.get()).isEqualTo(0); } @Test public void testWalkerDeep1() { final FileTreeWalker walker = new FileTreeWalker(simple, 1); final Path dir = newTempDir(null); final Path subDir = newTempDir(dir); final Path subSubDir = newTempDir(subDir); final Path subSubSubDir = newTempDir(subSubDir); Files.createTempFile(dir, "foo", "bar"); Files.createTempFile(dir, "foo", "bar"); cleanupVisitor(); walker.walk(dir); assertThat(preDir.get()).isEqualTo(1); assertThat(postDir.get()).isEqualTo(1); assertThat(fileC.get()).isEqualTo(3); assertThat(failFile.get()).isEqualTo(0); } @Test public void testWalkerDeep2ButTerminateOnDir() { final FileVisitor<Path> terminateOnDir = new FileVisitor<Path>() { @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { preDir.addAndGet(1); if (preDir.get() > 1) { return FileVisitResult.TERMINATE; } return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { fileC.addAndGet(1); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { failFile.addAndGet(1); return FileVisitResult.TERMINATE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { postDir.addAndGet(1); return FileVisitResult.CONTINUE; } }; final FileTreeWalker walker = new FileTreeWalker(terminateOnDir, 2); final Path dir = newTempDir(null); final Path subDir = newTempDir(dir); final Path subSubDir = newTempDir(subDir); final Path subSubSubDir = newTempDir(subSubDir); Files.createTempFile(dir, "foo", "bar"); Files.createTempFile(dir, "foo", "bar"); cleanupVisitor(); walker.walk(dir); assertThat(preDir.get()).isEqualTo(2); assertThat(postDir.get()).isEqualTo(0); assertThat(fileC.get()).isEqualTo(2); //FAILS @ mike assertThat(failFile.get()).isEqualTo(0); } @Test public void testWalkerDeep2ButSkipSibling() { final FileVisitor<Path> terminateOnDir = new FileVisitor<Path>() { @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { preDir.addAndGet(1); if (preDir.get() > 1) { return FileVisitResult.SKIP_SIBLINGS; } return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { fileC.addAndGet(1); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { failFile.addAndGet(1); return FileVisitResult.TERMINATE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { postDir.addAndGet(1); return FileVisitResult.CONTINUE; } }; final FileTreeWalker walker = new FileTreeWalker(terminateOnDir, 2); final Path dir = newTempDir(null); final Path subDir1 = newTempDir(dir); final Path subDir2 = newTempDir(dir); final Path subDir3 = newTempDir(dir); final Path subDir4 = newTempDir(dir); Files.createTempFile(dir, "foo", "bar"); Files.createTempFile(dir, "foo", "bar"); cleanupVisitor(); walker.walk(dir); assertThat(preDir.get()).isEqualTo(2); assertThat(postDir.get()).isEqualTo(1); assertThat(fileC.get()).isEqualTo(2); //FAILS assertThat(failFile.get()).isEqualTo(0); } @Test public void testWalkerDeep2ButThrowExceptionOnSibling() { final FileVisitor<Path> terminateOnDir = new FileVisitor<Path>() { @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { preDir.addAndGet(1); if (preDir.get() > 1) { throw new IOException(); } return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { fileC.addAndGet(1); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { failFile.addAndGet(1); return FileVisitResult.TERMINATE; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { postDir.addAndGet(1); if (exc == null) { throw new RuntimeException(); } return FileVisitResult.CONTINUE; } }; final FileTreeWalker walker = new FileTreeWalker(terminateOnDir, 2); final Path dir = newTempDir(null); final Path subDir1 = newTempDir(dir); final Path subDir2 = newTempDir(dir); final Path subDir3 = newTempDir(dir); final Path subDir4 = newTempDir(dir); Files.createTempFile(dir, "foo", "bar"); Files.createTempFile(dir, "foo", "bar"); cleanupVisitor(); walker.walk(dir); assertThat(preDir.get()).isEqualTo(2); assertThat(postDir.get()).isEqualTo(1); assertThat(fileC.get()).isEqualTo(2); //FAILS assertThat(failFile.get()).isEqualTo(0); } @Test public void testWalkerDeep2ButReturnNull() { final FileVisitor<Path> terminateOnDir = new FileVisitor<Path>() { @Override public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException { preDir.addAndGet(1); if (preDir.get() > 1) { return null; } return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { fileC.addAndGet(1); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException { failFile.addAndGet(1); return null; } @Override public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { postDir.addAndGet(1); if (exc == null) { throw new RuntimeException(); } return FileVisitResult.CONTINUE; } }; final FileTreeWalker walker = new FileTreeWalker(terminateOnDir, 2); final Path dir = newTempDir(null); final Path subDir1 = newTempDir(dir); final Path subDir2 = newTempDir(dir); final Path subDir3 = newTempDir(dir); final Path subDir4 = newTempDir(dir); Files.createTempFile(dir, "foo", "bar"); Files.createTempFile(dir, "foo", "bar"); cleanupVisitor(); walker.walk(dir); assertThat(preDir.get()).isEqualTo(2); assertThat(postDir.get()).isEqualTo(0); assertThat(fileC.get()).isEqualTo(2); //FAILS assertThat(failFile.get()).isEqualTo(0); } private void cleanupVisitor() { preDir.set(0); postDir.set(0); fileC.set(0); failFile.set(0); } }