168 lines
6.0 KiB
Java
168 lines
6.0 KiB
Java
/*
|
|
* 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.hadoop.fs.swift;
|
|
|
|
import org.apache.hadoop.fs.BlockLocation;
|
|
import org.apache.hadoop.fs.FileStatus;
|
|
import org.apache.hadoop.fs.Path;
|
|
import org.apache.hadoop.fs.swift.http.SwiftProtocolConstants;
|
|
import org.apache.hadoop.fs.swift.util.SwiftTestUtils;
|
|
import org.junit.Test;
|
|
|
|
import java.io.IOException;
|
|
|
|
/**
|
|
* Test block location logic.
|
|
* The endpoint may or may not be location-aware
|
|
*/
|
|
public class TestSwiftFileSystemBlockLocation extends SwiftFileSystemBaseTest {
|
|
|
|
|
|
@Test(timeout = SWIFT_TEST_TIMEOUT)
|
|
public void testLocateSingleFileBlocks() throws Throwable {
|
|
describe("verify that a file returns 1+ blocks");
|
|
FileStatus fileStatus = createFileAndGetStatus();
|
|
BlockLocation[] locations =
|
|
getFs().getFileBlockLocations(fileStatus, 0, 1);
|
|
assertNotEqual("No block locations supplied for " + fileStatus, 0,
|
|
locations.length);
|
|
for (BlockLocation location : locations) {
|
|
assertLocationValid(location);
|
|
}
|
|
}
|
|
|
|
private void assertLocationValid(BlockLocation location) throws
|
|
IOException {
|
|
LOG.info(location);
|
|
String[] hosts = location.getHosts();
|
|
String[] names = location.getNames();
|
|
assertNotEqual("No hosts supplied for " + location, 0, hosts.length);
|
|
//for every host, there's a name.
|
|
assertEquals("Unequal names and hosts in " + location,
|
|
hosts.length, names.length);
|
|
assertEquals(SwiftProtocolConstants.BLOCK_LOCATION,
|
|
location.getNames()[0]);
|
|
assertEquals(SwiftProtocolConstants.TOPOLOGY_PATH,
|
|
location.getTopologyPaths()[0]);
|
|
}
|
|
|
|
private FileStatus createFileAndGetStatus() throws IOException {
|
|
Path path = path("/test/locatedFile");
|
|
createFile(path);
|
|
return fs.getFileStatus(path);
|
|
}
|
|
|
|
@Test(timeout = SWIFT_TEST_TIMEOUT)
|
|
public void testLocateNullStatus() throws Throwable {
|
|
describe("verify that a null filestatus maps to a null location array");
|
|
BlockLocation[] locations =
|
|
getFs().getFileBlockLocations((FileStatus) null, 0, 1);
|
|
assertNull(locations);
|
|
}
|
|
|
|
@Test(timeout = SWIFT_TEST_TIMEOUT)
|
|
public void testLocateNegativeSeek() throws Throwable {
|
|
describe("verify that a negative offset is illegal");
|
|
try {
|
|
BlockLocation[] locations =
|
|
getFs().getFileBlockLocations(createFileAndGetStatus(),
|
|
-1,
|
|
1);
|
|
fail("Expected an exception, got " + locations.length + " locations");
|
|
} catch (IllegalArgumentException e) {
|
|
//expected
|
|
}
|
|
}
|
|
|
|
@Test(timeout = SWIFT_TEST_TIMEOUT)
|
|
public void testLocateNegativeLen() throws Throwable {
|
|
describe("verify that a negative length is illegal");
|
|
try {
|
|
BlockLocation[] locations =
|
|
getFs().getFileBlockLocations(createFileAndGetStatus(),
|
|
0,
|
|
-1);
|
|
fail("Expected an exception, got " + locations.length + " locations");
|
|
} catch (IllegalArgumentException e) {
|
|
//expected
|
|
}
|
|
}
|
|
|
|
|
|
@Test(timeout = SWIFT_TEST_TIMEOUT)
|
|
public void testLocateOutOfRangeLen() throws Throwable {
|
|
describe("overshooting the length is legal, as long as the" +
|
|
" origin location is valid");
|
|
|
|
BlockLocation[] locations =
|
|
getFs().getFileBlockLocations(createFileAndGetStatus(),
|
|
0,
|
|
data.length + 100);
|
|
assertNotNull(locations);
|
|
assertTrue(locations.length > 0);
|
|
}
|
|
|
|
@Test(timeout = SWIFT_TEST_TIMEOUT)
|
|
public void testLocateOutOfRangeSrc() throws Throwable {
|
|
describe("Seeking out of the file length returns an empty array");
|
|
|
|
BlockLocation[] locations =
|
|
getFs().getFileBlockLocations(createFileAndGetStatus(),
|
|
data.length + 100,
|
|
1);
|
|
assertEmptyBlockLocations(locations);
|
|
}
|
|
|
|
private void assertEmptyBlockLocations(BlockLocation[] locations) {
|
|
assertNotNull(locations);
|
|
if (locations.length!=0) {
|
|
fail("non empty locations[] with first entry of " + locations[0]);
|
|
}
|
|
}
|
|
|
|
@Test(timeout = SWIFT_TEST_TIMEOUT)
|
|
public void testLocateDirectory() throws Throwable {
|
|
describe("verify that locating a directory is an error");
|
|
createFile(path("/test/filename"));
|
|
FileStatus status = fs.getFileStatus(path("/test"));
|
|
LOG.info("Filesystem is " + fs + "; target is " + status);
|
|
SwiftTestUtils.assertIsDirectory(status);
|
|
BlockLocation[] locations;
|
|
locations = getFs().getFileBlockLocations(status,
|
|
0,
|
|
1);
|
|
assertEmptyBlockLocations(locations);
|
|
}
|
|
|
|
|
|
@Test(timeout = SWIFT_TEST_TIMEOUT)
|
|
public void testLocateRootDirectory() throws Throwable {
|
|
describe("verify that locating the root directory is an error");
|
|
FileStatus status = fs.getFileStatus(path("/"));
|
|
SwiftTestUtils.assertIsDirectory(status);
|
|
BlockLocation[] locations;
|
|
locations = getFs().getFileBlockLocations(status,
|
|
0,
|
|
1);
|
|
assertEmptyBlockLocations(locations);
|
|
}
|
|
|
|
|
|
}
|