blob: effcd9d1a905bcce3cfe90f2954ab35e39d18a32 [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.beam.sdk.io;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.endsWith;
import static org.hamcrest.Matchers.not;
import static org.hamcrest.Matchers.startsWith;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeFalse;
import java.io.File;
import java.nio.file.Paths;
import org.apache.beam.sdk.io.fs.ResolveOptions.StandardResolveOptions;
import org.apache.beam.sdk.io.fs.ResourceId;
import org.apache.beam.sdk.io.fs.ResourceIdTester;
import org.apache.commons.lang3.SystemUtils;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/**
* Tests for {@link LocalResourceId}.
*
* <p>TODO: re-enable unicode tests when BEAM-1453 is resolved.
*/
@RunWith(JUnit4.class)
public class LocalResourceIdTest {
@Rule public ExpectedException thrown = ExpectedException.none();
@Rule public TemporaryFolder tmpFolder = new TemporaryFolder();
@Test
public void testResolveInUnix() {
if (SystemUtils.IS_OS_WINDOWS) {
// Skip tests
return;
}
// Tests for local files without the scheme.
assertEquals(
toResourceIdentifier("/root/tmp/aa"),
toResourceIdentifier("/root/tmp/").resolve("aa", StandardResolveOptions.RESOLVE_FILE));
assertEquals(
toResourceIdentifier("/root/tmp/aa/bb/cc/"),
toResourceIdentifier("/root/tmp/")
.resolve("aa", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve("bb", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve("cc", StandardResolveOptions.RESOLVE_DIRECTORY));
// Tests absolute path.
assertEquals(
toResourceIdentifier("/root/tmp/aa"),
toResourceIdentifier("/root/tmp/bb/")
.resolve("/root/tmp/aa", StandardResolveOptions.RESOLVE_FILE));
// Tests empty authority and path.
assertEquals(
toResourceIdentifier("file:/aa"),
toResourceIdentifier("file:///").resolve("aa", StandardResolveOptions.RESOLVE_FILE));
}
@Test
public void testResolveNormalizationInUnix() {
if (SystemUtils.IS_OS_WINDOWS) {
// Skip tests
return;
}
// Tests normalization of "." and ".."
//
// Normalization is the implementation choice of LocalResourceId,
// and it is not required by ResourceId.resolve().
assertEquals(
toResourceIdentifier("file://home/bb"),
toResourceIdentifier("file://root/../home/output/../")
.resolve("aa", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve("..", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve("bb", StandardResolveOptions.RESOLVE_FILE));
assertEquals(
toResourceIdentifier("file://root/aa/bb"),
toResourceIdentifier("file://root/./")
.resolve("aa", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve(".", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve("bb", StandardResolveOptions.RESOLVE_FILE));
assertEquals(
toResourceIdentifier("aa/bb"),
toResourceIdentifier("a/../")
.resolve("aa", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve(".", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve("bb", StandardResolveOptions.RESOLVE_FILE));
assertEquals(
toResourceIdentifier("/aa/bb"),
toResourceIdentifier("/a/../")
.resolve("aa", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve(".", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve("bb", StandardResolveOptions.RESOLVE_FILE));
// Tests "./", "../", "~/".
assertEquals(
toResourceIdentifier("aa/bb"),
toResourceIdentifier("./")
.resolve("aa", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve(".", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve("bb", StandardResolveOptions.RESOLVE_FILE));
assertEquals(
toResourceIdentifier("../aa/bb"),
toResourceIdentifier("../")
.resolve("aa", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve(".", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve("bb", StandardResolveOptions.RESOLVE_FILE));
assertEquals(
toResourceIdentifier("~/aa/bb/"),
toResourceIdentifier("~/")
.resolve("aa", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve(".", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve("bb", StandardResolveOptions.RESOLVE_DIRECTORY));
}
@Test
public void testResolveHandleBadInputsInUnix() {
if (SystemUtils.IS_OS_WINDOWS) {
// Skip tests
return;
}
assertEquals(
toResourceIdentifier("/root/tmp/"),
toResourceIdentifier("/root/").resolve("tmp/", StandardResolveOptions.RESOLVE_DIRECTORY));
}
@Test
public void testResolveInvalidInputs() {
// TODO: Java core test failing on windows, https://issues.apache.org/jira/browse/BEAM-10730
assumeFalse(SystemUtils.IS_OS_WINDOWS);
thrown.expect(IllegalArgumentException.class);
thrown.expectMessage("The resolved file: [tmp/] should not end with '/'.");
toResourceIdentifier("/root/").resolve("tmp/", StandardResolveOptions.RESOLVE_FILE);
}
@Test
public void testResolveInvalidNotDirectory() {
// TODO: Java core test failing on windows, https://issues.apache.org/jira/browse/BEAM-10731
assumeFalse(SystemUtils.IS_OS_WINDOWS);
ResourceId tmp =
toResourceIdentifier("/root/").resolve("tmp", StandardResolveOptions.RESOLVE_FILE);
thrown.expect(IllegalStateException.class);
thrown.expectMessage("Expected the path is a directory, but had [/root/tmp].");
tmp.resolve("aa", StandardResolveOptions.RESOLVE_FILE);
}
@Test
public void testResolveInWindowsOS() {
// TODO: Java core test failing on windows, https://issues.apache.org/jira/browse/BEAM-10732
assumeFalse(SystemUtils.IS_OS_WINDOWS);
if (!SystemUtils.IS_OS_WINDOWS) {
// Skip tests
return;
}
assertEquals(
toResourceIdentifier("C:\\my home\\out put"),
toResourceIdentifier("C:\\my home\\")
.resolve("out put", StandardResolveOptions.RESOLVE_FILE));
assertEquals(
toResourceIdentifier("C:\\out put"),
toResourceIdentifier("C:\\my home\\")
.resolve("..", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve(".", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve("out put", StandardResolveOptions.RESOLVE_FILE));
assertEquals(
toResourceIdentifier("C:\\my home\\**\\*"),
toResourceIdentifier("C:\\my home\\")
.resolve("**", StandardResolveOptions.RESOLVE_DIRECTORY)
.resolve("*", StandardResolveOptions.RESOLVE_FILE));
}
@Test
public void testGetCurrentDirectoryInUnix() {
// Tests for local files without the scheme.
// TODO: Java core test failing on windows, https://issues.apache.org/jira/browse/BEAM-10733
assumeFalse(SystemUtils.IS_OS_WINDOWS);
assertEquals(
toResourceIdentifier("/root/tmp/"),
toResourceIdentifier("/root/tmp/").getCurrentDirectory());
assertEquals(toResourceIdentifier("/"), toResourceIdentifier("/").getCurrentDirectory());
// Tests path without parent.
assertEquals(toResourceIdentifier("./"), toResourceIdentifier("output").getCurrentDirectory());
}
@Test
public void testGetScheme() {
// Tests for local files without the scheme.
assertEquals("file", toResourceIdentifier("/root/tmp/").getScheme());
}
@Test
public void testEquals() {
// TODO: Java core test failing on windows, https://issues.apache.org/jira/browse/BEAM-10734
assumeFalse(SystemUtils.IS_OS_WINDOWS);
assertEquals(toResourceIdentifier("/root/tmp/"), toResourceIdentifier("/root/tmp/"));
assertNotEquals(toResourceIdentifier("/root/tmp"), toResourceIdentifier("/root/tmp/"));
}
@Test
public void testIsDirectory() {
// TODO: Java core test failing on windows, https://issues.apache.org/jira/browse/BEAM-10735
assumeFalse(SystemUtils.IS_OS_WINDOWS);
assertTrue(toResourceIdentifier("/").isDirectory());
assertTrue(toResourceIdentifier("/root/tmp/").isDirectory());
assertFalse(toResourceIdentifier("/root").isDirectory());
}
@Test
public void testToString() throws Exception {
File someFile = tmpFolder.newFile("somefile");
LocalResourceId fileResource =
LocalResourceId.fromPath(someFile.toPath(), /* isDirectory */ false);
assertThat(fileResource.toString(), not(endsWith(File.separator)));
assertThat(fileResource.toString(), containsString("somefile"));
assertThat(fileResource.toString(), startsWith(tmpFolder.getRoot().getAbsolutePath()));
LocalResourceId dirResource =
LocalResourceId.fromPath(someFile.toPath(), /* isDirectory */ true);
assertThat(dirResource.toString(), endsWith(File.separator));
assertThat(dirResource.toString(), containsString("somefile"));
assertThat(dirResource.toString(), startsWith(tmpFolder.getRoot().getAbsolutePath()));
}
@Test
public void testGetFilename() {
assertNull(toResourceIdentifier("/").getFilename());
assertEquals("tmp", toResourceIdentifier("/root/tmp").getFilename());
assertEquals("tmp", toResourceIdentifier("/root/tmp/").getFilename());
assertEquals("xyz.txt", toResourceIdentifier("/root/tmp/xyz.txt").getFilename());
}
@Test
public void testResourceIdTester() {
// TODO: Java core test failing on windows, https://issues.apache.org/jira/browse/BEAM-10736
assumeFalse(SystemUtils.IS_OS_WINDOWS);
ResourceIdTester.runResourceIdBattery(toResourceIdentifier("/tmp/foo/"));
}
private LocalResourceId toResourceIdentifier(String str) {
boolean isDirectory;
if (SystemUtils.IS_OS_WINDOWS) {
isDirectory = str.endsWith("\\");
} else {
isDirectory = str.endsWith("/");
}
return LocalResourceId.fromPath(Paths.get(str), isDirectory);
}
}