| /* |
| * 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.lucene.mockfile; |
| |
| import java.io.IOException; |
| import java.io.OutputStream; |
| import java.net.URI; |
| import java.nio.file.DirectoryStream; |
| import java.nio.file.Files; |
| import java.nio.file.InvalidPathException; |
| import java.nio.file.Path; |
| |
| import org.apache.lucene.util.Constants; |
| import org.apache.lucene.util.LuceneTestCase; |
| import org.apache.lucene.util.LuceneTestCase.SuppressFileSystems; |
| |
| /** |
| * Base class for testing mockfilesystems. This tests things |
| * that really need to work: Path equals()/hashcode(), directory listing |
| * glob and filtering, URI conversion, etc. |
| */ |
| @SuppressFileSystems("*") // we suppress random filesystems and do tests explicitly. |
| public abstract class MockFileSystemTestCase extends LuceneTestCase { |
| |
| /** wraps Path with custom behavior */ |
| protected abstract Path wrap(Path path); |
| |
| /** Test that Path.hashcode/equals are sane */ |
| public void testHashCodeEquals() throws IOException { |
| Path dir = wrap(createTempDir()); |
| |
| Path f1 = dir.resolve("file1"); |
| Path f1Again = dir.resolve("file1"); |
| Path f2 = dir.resolve("file2"); |
| |
| assertEquals(f1, f1); |
| assertFalse(f1.equals(null)); |
| assertEquals(f1, f1Again); |
| assertEquals(f1.hashCode(), f1Again.hashCode()); |
| assertFalse(f1.equals(f2)); |
| dir.getFileSystem().close(); |
| } |
| |
| /** Test that URIs are not corrumpted */ |
| public void testURI() throws IOException { |
| implTestURI("file1"); // plain ASCII |
| } |
| |
| public void testURIumlaute() throws IOException { |
| implTestURI("äÄöÖüÜß"); // Umlaute and s-zet |
| } |
| |
| public void testURIchinese() throws IOException { |
| implTestURI("中国"); // chinese |
| } |
| |
| private void implTestURI(String fileName) throws IOException { |
| assumeFalse("broken on J9: see https://issues.apache.org/jira/browse/LUCENE-6517", Constants.JAVA_VENDOR.startsWith("IBM")); |
| Path dir = wrap(createTempDir()); |
| |
| try { |
| dir.resolve(fileName); |
| } catch (InvalidPathException ipe) { |
| assumeNoException("couldn't resolve '"+fileName+"'", ipe); |
| } |
| |
| Path f1 = dir.resolve(fileName); |
| URI uri = f1.toUri(); |
| Path f2 = dir.getFileSystem().provider().getPath(uri); |
| assertEquals(f1, f2); |
| |
| dir.getFileSystem().close(); |
| } |
| |
| /** Tests that newDirectoryStream with a filter works correctly */ |
| public void testDirectoryStreamFiltered() throws IOException { |
| Path dir = wrap(createTempDir()); |
| |
| OutputStream file = Files.newOutputStream(dir.resolve("file1")); |
| file.write(5); |
| file.close(); |
| try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir)) { |
| int count = 0; |
| for (Path path : stream) { |
| assertTrue(path instanceof FilterPath); |
| if (!path.getFileName().toString().startsWith("extra")) { |
| count++; |
| } |
| } |
| assertEquals(1, count); |
| } |
| dir.getFileSystem().close(); |
| } |
| |
| /** Tests that newDirectoryStream with globbing works correctly */ |
| public void testDirectoryStreamGlobFiltered() throws IOException { |
| Path dir = wrap(createTempDir()); |
| |
| OutputStream file = Files.newOutputStream(dir.resolve("foo")); |
| file.write(5); |
| file.close(); |
| file = Files.newOutputStream(dir.resolve("bar")); |
| file.write(5); |
| file.close(); |
| try (DirectoryStream<Path> stream = Files.newDirectoryStream(dir, "f*")) { |
| int count = 0; |
| for (Path path : stream) { |
| assertTrue(path instanceof FilterPath); |
| ++count; |
| } |
| assertEquals(1, count); |
| } |
| dir.getFileSystem().close(); |
| } |
| } |