HADOOP-13257. Improve Azure Data Lake contract tests. Contributed by Vishwajeet Dusane
This commit is contained in:
parent
51211a7d7a
commit
4113ec5fa5
|
@ -346,7 +346,6 @@ public class AdlFileSystem extends FileSystem {
|
||||||
* @see #setPermission(Path, FsPermission)
|
* @see #setPermission(Path, FsPermission)
|
||||||
* @deprecated API only for 0.20-append
|
* @deprecated API only for 0.20-append
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
|
||||||
@Override
|
@Override
|
||||||
public FSDataOutputStream createNonRecursive(Path f, FsPermission permission,
|
public FSDataOutputStream createNonRecursive(Path f, FsPermission permission,
|
||||||
EnumSet<CreateFlag> flags, int bufferSize, short replication,
|
EnumSet<CreateFlag> flags, int bufferSize, short replication,
|
||||||
|
@ -471,6 +470,10 @@ public class AdlFileSystem extends FileSystem {
|
||||||
@Override
|
@Override
|
||||||
public boolean rename(final Path src, final Path dst) throws IOException {
|
public boolean rename(final Path src, final Path dst) throws IOException {
|
||||||
statistics.incrementWriteOps(1);
|
statistics.incrementWriteOps(1);
|
||||||
|
if (toRelativeFilePath(src).equals("/")) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return adlClient.rename(toRelativeFilePath(src), toRelativeFilePath(dst));
|
return adlClient.rename(toRelativeFilePath(src), toRelativeFilePath(dst));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -522,9 +525,24 @@ public class AdlFileSystem extends FileSystem {
|
||||||
public boolean delete(final Path path, final boolean recursive)
|
public boolean delete(final Path path, final boolean recursive)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
statistics.incrementWriteOps(1);
|
statistics.incrementWriteOps(1);
|
||||||
|
String relativePath = toRelativeFilePath(path);
|
||||||
|
// Delete on root directory not supported.
|
||||||
|
if (relativePath.equals("/")) {
|
||||||
|
// This is important check after recent commit
|
||||||
|
// HADOOP-12977 and HADOOP-13716 validates on root for
|
||||||
|
// 1. if root is empty and non recursive delete then return false.
|
||||||
|
// 2. if root is non empty and non recursive delete then throw exception.
|
||||||
|
if (!recursive
|
||||||
|
&& adlClient.enumerateDirectory(toRelativeFilePath(path), 1).size()
|
||||||
|
> 0) {
|
||||||
|
throw new IOException("Delete on root is not supported.");
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return recursive ?
|
return recursive ?
|
||||||
adlClient.deleteRecursive(toRelativeFilePath(path)) :
|
adlClient.deleteRecursive(relativePath) :
|
||||||
adlClient.delete(toRelativeFilePath(path));
|
adlClient.delete(relativePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -102,7 +102,7 @@ public class TestAdlRead extends AdlMockWebServer {
|
||||||
n += count;
|
n += count;
|
||||||
}
|
}
|
||||||
|
|
||||||
Assert.assertEquals(testData.getActualData().length, expectedData.length);
|
Assert.assertEquals(expectedData.length, testData.getActualData().length);
|
||||||
Assert.assertArrayEquals(expectedData, testData.getActualData());
|
Assert.assertArrayEquals(expectedData, testData.getActualData());
|
||||||
in.close();
|
in.close();
|
||||||
if (testData.isCheckOfNoOfCalls()) {
|
if (testData.isCheckOfNoOfCalls()) {
|
||||||
|
@ -119,8 +119,8 @@ public class TestAdlRead extends AdlMockWebServer {
|
||||||
for (int i = 0; i < 1000; ++i) {
|
for (int i = 0; i < 1000; ++i) {
|
||||||
int position = random.nextInt(testData.getActualData().length);
|
int position = random.nextInt(testData.getActualData().length);
|
||||||
in.seek(position);
|
in.seek(position);
|
||||||
Assert.assertEquals(in.getPos(), position);
|
Assert.assertEquals(position, in.getPos());
|
||||||
Assert.assertEquals(in.read(), testData.getActualData()[position] & 0xFF);
|
Assert.assertEquals(testData.getActualData()[position] & 0xFF, in.read());
|
||||||
}
|
}
|
||||||
in.close();
|
in.close();
|
||||||
if (testData.isCheckOfNoOfCalls()) {
|
if (testData.isCheckOfNoOfCalls()) {
|
||||||
|
|
|
@ -50,7 +50,7 @@ public class TestListStatus extends AdlMockWebServer {
|
||||||
.listStatus(new Path("/test1/test2"));
|
.listStatus(new Path("/test1/test2"));
|
||||||
long endTime = Time.monotonicNow();
|
long endTime = Time.monotonicNow();
|
||||||
LOG.debug("Time : " + (endTime - startTime));
|
LOG.debug("Time : " + (endTime - startTime));
|
||||||
Assert.assertEquals(ls.length, 10);
|
Assert.assertEquals(10, ls.length);
|
||||||
|
|
||||||
getMockServer().enqueue(new MockResponse().setResponseCode(200)
|
getMockServer().enqueue(new MockResponse().setResponseCode(200)
|
||||||
.setBody(TestADLResponseData.getListFileStatusJSONResponse(200)));
|
.setBody(TestADLResponseData.getListFileStatusJSONResponse(200)));
|
||||||
|
@ -58,7 +58,7 @@ public class TestListStatus extends AdlMockWebServer {
|
||||||
ls = getMockAdlFileSystem().listStatus(new Path("/test1/test2"));
|
ls = getMockAdlFileSystem().listStatus(new Path("/test1/test2"));
|
||||||
endTime = Time.monotonicNow();
|
endTime = Time.monotonicNow();
|
||||||
LOG.debug("Time : " + (endTime - startTime));
|
LOG.debug("Time : " + (endTime - startTime));
|
||||||
Assert.assertEquals(ls.length, 200);
|
Assert.assertEquals(200, ls.length);
|
||||||
|
|
||||||
getMockServer().enqueue(new MockResponse().setResponseCode(200)
|
getMockServer().enqueue(new MockResponse().setResponseCode(200)
|
||||||
.setBody(TestADLResponseData.getListFileStatusJSONResponse(2048)));
|
.setBody(TestADLResponseData.getListFileStatusJSONResponse(2048)));
|
||||||
|
@ -66,7 +66,7 @@ public class TestListStatus extends AdlMockWebServer {
|
||||||
ls = getMockAdlFileSystem().listStatus(new Path("/test1/test2"));
|
ls = getMockAdlFileSystem().listStatus(new Path("/test1/test2"));
|
||||||
endTime = Time.monotonicNow();
|
endTime = Time.monotonicNow();
|
||||||
LOG.debug("Time : " + (endTime - startTime));
|
LOG.debug("Time : " + (endTime - startTime));
|
||||||
Assert.assertEquals(ls.length, 2048);
|
Assert.assertEquals(2048, ls.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -23,11 +23,10 @@ import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.fs.contract.AbstractContractAppendTest;
|
import org.apache.hadoop.fs.contract.AbstractContractAppendTest;
|
||||||
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
||||||
import org.apache.hadoop.fs.contract.ContractTestUtils;
|
import org.apache.hadoop.fs.contract.ContractTestUtils;
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify Adls APPEND semantics compliance with Hadoop.
|
* Test Append on Adl file system.
|
||||||
*/
|
*/
|
||||||
public class TestAdlContractAppendLive extends AbstractContractAppendTest {
|
public class TestAdlContractAppendLive extends AbstractContractAppendTest {
|
||||||
|
|
||||||
|
@ -42,12 +41,4 @@ public class TestAdlContractAppendLive extends AbstractContractAppendTest {
|
||||||
ContractTestUtils.unsupported("Skipping since renaming file in append "
|
ContractTestUtils.unsupported("Skipping since renaming file in append "
|
||||||
+ "mode not supported in Adl");
|
+ "mode not supported in Adl");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
|
||||||
@Override
|
|
||||||
public void setup() throws Exception {
|
|
||||||
org.junit.Assume
|
|
||||||
.assumeTrue(AdlStorageConfiguration.isContractTestEnabled());
|
|
||||||
super.setup();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,14 +20,15 @@
|
||||||
package org.apache.hadoop.fs.adl.live;
|
package org.apache.hadoop.fs.adl.live;
|
||||||
|
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.fs.Path;
|
||||||
import org.apache.hadoop.fs.contract.AbstractContractConcatTest;
|
import org.apache.hadoop.fs.contract.AbstractContractConcatTest;
|
||||||
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
||||||
import org.apache.hadoop.fs.contract.ContractTestUtils;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import static org.apache.hadoop.fs.contract.ContractTestUtils.touch;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify Adls CONCAT semantics compliance with Hadoop.
|
* Test concat on Adl file system.
|
||||||
*/
|
*/
|
||||||
public class TestAdlContractConcatLive extends AbstractContractConcatTest {
|
public class TestAdlContractConcatLive extends AbstractContractConcatTest {
|
||||||
|
|
||||||
|
@ -36,17 +37,13 @@ public class TestAdlContractConcatLive extends AbstractContractConcatTest {
|
||||||
return new AdlStorageContract(configuration);
|
return new AdlStorageContract(configuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
|
||||||
@Override
|
|
||||||
public void setup() throws Exception {
|
|
||||||
org.junit.Assume
|
|
||||||
.assumeTrue(AdlStorageConfiguration.isContractTestEnabled());
|
|
||||||
super.setup();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testConcatMissingTarget() throws Throwable {
|
public void testConcatMissingTarget() throws Throwable {
|
||||||
ContractTestUtils.unsupported("BUG : Adl to support expectation from "
|
Path testPath = path("test");
|
||||||
+ "concat on missing targets.");
|
Path zeroByteFile = new Path(testPath, "zero.txt");
|
||||||
|
Path target = new Path(testPath, "target");
|
||||||
|
touch(getFileSystem(), zeroByteFile);
|
||||||
|
// Concat on missing target is allowed on Adls file system.
|
||||||
|
getFileSystem().concat(target, new Path[] {zeroByteFile});
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -22,12 +22,9 @@ package org.apache.hadoop.fs.adl.live;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.fs.contract.AbstractContractCreateTest;
|
import org.apache.hadoop.fs.contract.AbstractContractCreateTest;
|
||||||
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
||||||
import org.apache.hadoop.fs.contract.ContractTestUtils;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify Adls CREATE semantics compliance with Hadoop.
|
* Test creating files, overwrite options.
|
||||||
*/
|
*/
|
||||||
public class TestAdlContractCreateLive extends AbstractContractCreateTest {
|
public class TestAdlContractCreateLive extends AbstractContractCreateTest {
|
||||||
|
|
||||||
|
@ -35,18 +32,4 @@ public class TestAdlContractCreateLive extends AbstractContractCreateTest {
|
||||||
protected AbstractFSContract createContract(Configuration configuration) {
|
protected AbstractFSContract createContract(Configuration configuration) {
|
||||||
return new AdlStorageContract(configuration);
|
return new AdlStorageContract(configuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
|
||||||
@Override
|
|
||||||
public void setup() throws Exception {
|
|
||||||
org.junit.Assume
|
|
||||||
.assumeTrue(AdlStorageConfiguration.isContractTestEnabled());
|
|
||||||
super.setup();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testOverwriteEmptyDirectory() throws Throwable {
|
|
||||||
ContractTestUtils
|
|
||||||
.unsupported("BUG : Adl to support override empty " + "directory.");
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -22,10 +22,9 @@ package org.apache.hadoop.fs.adl.live;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.fs.contract.AbstractContractDeleteTest;
|
import org.apache.hadoop.fs.contract.AbstractContractDeleteTest;
|
||||||
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
||||||
import org.junit.Before;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify Adls DELETE semantics compliance with Hadoop.
|
* Test delete contract test.
|
||||||
*/
|
*/
|
||||||
public class TestAdlContractDeleteLive extends AbstractContractDeleteTest {
|
public class TestAdlContractDeleteLive extends AbstractContractDeleteTest {
|
||||||
|
|
||||||
|
@ -33,12 +32,4 @@ public class TestAdlContractDeleteLive extends AbstractContractDeleteTest {
|
||||||
protected AbstractFSContract createContract(Configuration configuration) {
|
protected AbstractFSContract createContract(Configuration configuration) {
|
||||||
return new AdlStorageContract(configuration);
|
return new AdlStorageContract(configuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
|
||||||
@Override
|
|
||||||
public void setup() throws Exception {
|
|
||||||
org.junit.Assume
|
|
||||||
.assumeTrue(AdlStorageConfiguration.isContractTestEnabled());
|
|
||||||
super.setup();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
/*
|
||||||
|
* 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.adl.live;
|
||||||
|
|
||||||
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.fs.contract.AbstractContractGetFileStatusTest;
|
||||||
|
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test getFileStatus contract test.
|
||||||
|
*/
|
||||||
|
public class TestAdlContractGetFileStatusLive extends
|
||||||
|
AbstractContractGetFileStatusTest {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected AbstractFSContract createContract(Configuration configuration) {
|
||||||
|
return new AdlStorageContract(configuration);
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,34 +22,13 @@ package org.apache.hadoop.fs.adl.live;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.fs.contract.AbstractContractMkdirTest;
|
import org.apache.hadoop.fs.contract.AbstractContractMkdirTest;
|
||||||
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
||||||
import org.apache.hadoop.fs.contract.ContractTestUtils;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify Adls MKDIR semantics compliance with Hadoop.
|
* Test Mkdir contract on Adl storage file system.
|
||||||
*/
|
*/
|
||||||
public class TestAdlContractMkdirLive extends AbstractContractMkdirTest {
|
public class TestAdlContractMkdirLive extends AbstractContractMkdirTest {
|
||||||
@Override
|
@Override
|
||||||
protected AbstractFSContract createContract(Configuration conf) {
|
protected AbstractFSContract createContract(Configuration conf) {
|
||||||
return new AdlStorageContract(conf);
|
return new AdlStorageContract(conf);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
@Before
|
|
||||||
@Override
|
|
||||||
public void setup() throws Exception {
|
|
||||||
org.junit.Assume
|
|
||||||
.assumeTrue(AdlStorageConfiguration.isContractTestEnabled());
|
|
||||||
super.setup();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testMkdirOverParentFile() throws Throwable {
|
|
||||||
ContractTestUtils.unsupported("Not supported by Adl");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testNoMkdirOverFile() throws Throwable {
|
|
||||||
ContractTestUtils.unsupported("Not supported by Adl");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -22,10 +22,9 @@ package org.apache.hadoop.fs.adl.live;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.fs.contract.AbstractContractOpenTest;
|
import org.apache.hadoop.fs.contract.AbstractContractOpenTest;
|
||||||
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
||||||
import org.junit.Before;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify Adls OPEN/READ semantics compliance with Hadoop.
|
* Test OPEN - read API.
|
||||||
*/
|
*/
|
||||||
public class TestAdlContractOpenLive extends AbstractContractOpenTest {
|
public class TestAdlContractOpenLive extends AbstractContractOpenTest {
|
||||||
|
|
||||||
|
@ -33,12 +32,4 @@ public class TestAdlContractOpenLive extends AbstractContractOpenTest {
|
||||||
protected AbstractFSContract createContract(Configuration configuration) {
|
protected AbstractFSContract createContract(Configuration configuration) {
|
||||||
return new AdlStorageContract(configuration);
|
return new AdlStorageContract(configuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
|
||||||
@Override
|
|
||||||
public void setup() throws Exception {
|
|
||||||
org.junit.Assume
|
|
||||||
.assumeTrue(AdlStorageConfiguration.isContractTestEnabled());
|
|
||||||
super.setup();
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -22,12 +22,9 @@ package org.apache.hadoop.fs.adl.live;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.fs.contract.AbstractContractRenameTest;
|
import org.apache.hadoop.fs.contract.AbstractContractRenameTest;
|
||||||
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
||||||
import org.apache.hadoop.fs.contract.ContractTestUtils;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify Adls RENAME semantics compliance with Hadoop.
|
* Test rename contract test cases on Adl file system.
|
||||||
*/
|
*/
|
||||||
public class TestAdlContractRenameLive extends AbstractContractRenameTest {
|
public class TestAdlContractRenameLive extends AbstractContractRenameTest {
|
||||||
|
|
||||||
|
@ -35,29 +32,4 @@ public class TestAdlContractRenameLive extends AbstractContractRenameTest {
|
||||||
protected AbstractFSContract createContract(Configuration configuration) {
|
protected AbstractFSContract createContract(Configuration configuration) {
|
||||||
return new AdlStorageContract(configuration);
|
return new AdlStorageContract(configuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
|
||||||
@Override
|
|
||||||
public void setup() throws Exception {
|
|
||||||
org.junit.Assume
|
|
||||||
.assumeTrue(AdlStorageConfiguration.isContractTestEnabled());
|
|
||||||
super.setup();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testRenameFileOverExistingFile() throws Throwable {
|
|
||||||
ContractTestUtils
|
|
||||||
.unsupported("BUG : Adl to support full complete POSIX" + "behaviour");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testRenameFileNonexistentDir() throws Throwable {
|
|
||||||
ContractTestUtils
|
|
||||||
.unsupported("BUG : Adl to support create dir is not " + "exist");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testRenameWithNonEmptySubDir() throws Throwable {
|
|
||||||
ContractTestUtils.unsupported("BUG : Adl to support non empty dir move.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,12 +22,9 @@ package org.apache.hadoop.fs.adl.live;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.fs.contract.AbstractContractRootDirectoryTest;
|
import org.apache.hadoop.fs.contract.AbstractContractRootDirectoryTest;
|
||||||
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
||||||
import org.apache.hadoop.fs.contract.ContractTestUtils;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify Adls root level operation support.
|
* Test operation on root level.
|
||||||
*/
|
*/
|
||||||
public class TestAdlContractRootDirLive
|
public class TestAdlContractRootDirLive
|
||||||
extends AbstractContractRootDirectoryTest {
|
extends AbstractContractRootDirectoryTest {
|
||||||
|
@ -35,18 +32,4 @@ public class TestAdlContractRootDirLive
|
||||||
protected AbstractFSContract createContract(Configuration configuration) {
|
protected AbstractFSContract createContract(Configuration configuration) {
|
||||||
return new AdlStorageContract(configuration);
|
return new AdlStorageContract(configuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
|
||||||
@Override
|
|
||||||
public void setup() throws Exception {
|
|
||||||
org.junit.Assume
|
|
||||||
.assumeTrue(AdlStorageConfiguration.isContractTestEnabled());
|
|
||||||
super.setup();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testRmNonEmptyRootDirNonRecursive() throws Throwable {
|
|
||||||
ContractTestUtils.unsupported(
|
|
||||||
"BUG : Adl should throw exception instred " + "of returning false.");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,10 +22,9 @@ package org.apache.hadoop.fs.adl.live;
|
||||||
import org.apache.hadoop.conf.Configuration;
|
import org.apache.hadoop.conf.Configuration;
|
||||||
import org.apache.hadoop.fs.contract.AbstractContractSeekTest;
|
import org.apache.hadoop.fs.contract.AbstractContractSeekTest;
|
||||||
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
||||||
import org.junit.Before;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify Adls OPEN/READ seek operation support.
|
* Test seek operation on Adl file system.
|
||||||
*/
|
*/
|
||||||
public class TestAdlContractSeekLive extends AbstractContractSeekTest {
|
public class TestAdlContractSeekLive extends AbstractContractSeekTest {
|
||||||
|
|
||||||
|
@ -33,12 +32,4 @@ public class TestAdlContractSeekLive extends AbstractContractSeekTest {
|
||||||
protected AbstractFSContract createContract(Configuration configuration) {
|
protected AbstractFSContract createContract(Configuration configuration) {
|
||||||
return new AdlStorageContract(configuration);
|
return new AdlStorageContract(configuration);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
|
||||||
@Override
|
|
||||||
public void setup() throws Exception {
|
|
||||||
org.junit.Assume
|
|
||||||
.assumeTrue(AdlStorageConfiguration.isContractTestEnabled());
|
|
||||||
super.setup();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,27 +23,63 @@ import org.apache.hadoop.fs.FSDataInputStream;
|
||||||
import org.apache.hadoop.fs.FSDataOutputStream;
|
import org.apache.hadoop.fs.FSDataOutputStream;
|
||||||
import org.apache.hadoop.fs.FileSystem;
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
import org.apache.hadoop.fs.Path;
|
import org.apache.hadoop.fs.Path;
|
||||||
|
import org.apache.hadoop.fs.adl.common.Parallelized;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.junit.runners.Parameterized;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import static org.apache.hadoop.fs.adl.AdlConfKeys.WRITE_BUFFER_SIZE_KEY;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify different data segment size writes ensure the integrity and
|
* Verify data integrity with different data sizes with buffer size.
|
||||||
* order of the data.
|
|
||||||
*/
|
*/
|
||||||
|
@RunWith(Parallelized.class)
|
||||||
public class TestAdlDifferentSizeWritesLive {
|
public class TestAdlDifferentSizeWritesLive {
|
||||||
|
private static Random rand = new Random();
|
||||||
|
private int totalSize;
|
||||||
|
private int chunkSize;
|
||||||
|
|
||||||
|
public TestAdlDifferentSizeWritesLive(int totalSize, int chunkSize) {
|
||||||
|
this.totalSize = totalSize;
|
||||||
|
this.chunkSize = chunkSize;
|
||||||
|
}
|
||||||
|
|
||||||
public static byte[] getRandomByteArrayData(int size) {
|
public static byte[] getRandomByteArrayData(int size) {
|
||||||
byte[] b = new byte[size];
|
byte[] b = new byte[size];
|
||||||
Random rand = new Random();
|
|
||||||
rand.nextBytes(b);
|
rand.nextBytes(b);
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Parameterized.Parameters(name = "{index}: Data Size [{0}] ; Chunk Size "
|
||||||
|
+ "[{1}]")
|
||||||
|
public static Collection testDataForIntegrityTest() {
|
||||||
|
return Arrays.asList(
|
||||||
|
new Object[][] {{4 * 1024, 1 * 1024}, {4 * 1024, 7 * 1024},
|
||||||
|
{4 * 1024, 10}, {2 * 1024, 10}, {1 * 1024, 10}, {100, 1},
|
||||||
|
{4 * 1024, 1 * 1024}, {7 * 1024, 2 * 1024}, {9 * 1024, 2 * 1024},
|
||||||
|
{10 * 1024, 3 * 1024}, {10 * 1024, 1 * 1024},
|
||||||
|
{10 * 1024, 8 * 1024}});
|
||||||
|
}
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void cleanUpParent() throws IOException, URISyntaxException {
|
||||||
|
if (AdlStorageConfiguration.isContractTestEnabled()) {
|
||||||
|
Path path = new Path("/test/dataIntegrityCheck/");
|
||||||
|
FileSystem fs = AdlStorageConfiguration.createStorageConnector();
|
||||||
|
fs.delete(path, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() throws Exception {
|
public void setup() throws Exception {
|
||||||
org.junit.Assume
|
org.junit.Assume
|
||||||
|
@ -51,32 +87,17 @@ public class TestAdlDifferentSizeWritesLive {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSmallDataWrites() throws IOException {
|
public void testDataIntegrity() throws IOException {
|
||||||
testDataIntegrity(4 * 1024 * 1024, 1 * 1024);
|
Path path = new Path(
|
||||||
testDataIntegrity(4 * 1024 * 1024, 7 * 1024);
|
"/test/dataIntegrityCheck/" + UUID.randomUUID().toString());
|
||||||
testDataIntegrity(4 * 1024 * 1024, 10);
|
|
||||||
testDataIntegrity(2 * 1024 * 1024, 10);
|
|
||||||
testDataIntegrity(1 * 1024 * 1024, 10);
|
|
||||||
testDataIntegrity(100, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testMediumDataWrites() throws IOException {
|
|
||||||
testDataIntegrity(4 * 1024 * 1024, 1 * 1024 * 1024);
|
|
||||||
testDataIntegrity(7 * 1024 * 1024, 2 * 1024 * 1024);
|
|
||||||
testDataIntegrity(9 * 1024 * 1024, 2 * 1024 * 1024);
|
|
||||||
testDataIntegrity(10 * 1024 * 1024, 3 * 1024 * 1024);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void testDataIntegrity(int totalSize, int chunkSize)
|
|
||||||
throws IOException {
|
|
||||||
Path path = new Path("/test/dataIntegrityCheck");
|
|
||||||
FileSystem fs = null;
|
FileSystem fs = null;
|
||||||
|
AdlStorageConfiguration.getConfiguration()
|
||||||
|
.setInt(WRITE_BUFFER_SIZE_KEY, 4 * 1024);
|
||||||
try {
|
try {
|
||||||
fs = AdlStorageConfiguration.createStorageConnector();
|
fs = AdlStorageConfiguration.createStorageConnector();
|
||||||
} catch (URISyntaxException e) {
|
} catch (URISyntaxException e) {
|
||||||
throw new IllegalStateException("Can not initialize ADL FileSystem. "
|
throw new IllegalStateException("Can not initialize ADL FileSystem. "
|
||||||
+ "Please check fs.defaultFS property.", e);
|
+ "Please check test.fs.adl.name property.", e);
|
||||||
}
|
}
|
||||||
byte[] expectedData = getRandomByteArrayData(totalSize);
|
byte[] expectedData = getRandomByteArrayData(totalSize);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* 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.adl.live;
|
||||||
|
|
||||||
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.fs.DelegateToFileSystem;
|
||||||
|
import org.apache.hadoop.fs.FileContext;
|
||||||
|
import org.apache.hadoop.fs.FileContextCreateMkdirBaseTest;
|
||||||
|
import org.apache.hadoop.fs.FileContextTestHelper;
|
||||||
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
|
import org.junit.Assume;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test file context Create/Mkdir operation.
|
||||||
|
*/
|
||||||
|
public class TestAdlFileContextCreateMkdirLive
|
||||||
|
extends FileContextCreateMkdirBaseTest {
|
||||||
|
private static final String KEY_FILE_SYSTEM = "test.fs.adl.name";
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void skipTestCheck() {
|
||||||
|
Assume.assumeTrue(AdlStorageConfiguration.isContractTestEnabled());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
Configuration conf = AdlStorageConfiguration.getConfiguration();
|
||||||
|
String fileSystem = conf.get(KEY_FILE_SYSTEM);
|
||||||
|
if (fileSystem == null || fileSystem.trim().length() == 0) {
|
||||||
|
throw new Exception("Default file system not configured.");
|
||||||
|
}
|
||||||
|
URI uri = new URI(fileSystem);
|
||||||
|
FileSystem fs = AdlStorageConfiguration.createStorageConnector();
|
||||||
|
fc = FileContext.getFileContext(
|
||||||
|
new DelegateToFileSystem(uri, fs, conf, fs.getScheme(), false) {
|
||||||
|
}, conf);
|
||||||
|
super.setUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected FileContextTestHelper createFileContextHelper() {
|
||||||
|
// On Windows, root directory path is created from local running directory.
|
||||||
|
// Adl does not support ':' as part of the path which results in failure.
|
||||||
|
return new FileContextTestHelper(UUID.randomUUID().toString());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,99 @@
|
||||||
|
/*
|
||||||
|
* 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.adl.live;
|
||||||
|
|
||||||
|
import org.apache.hadoop.conf.Configuration;
|
||||||
|
import org.apache.hadoop.fs.*;
|
||||||
|
import org.junit.Assume;
|
||||||
|
import org.junit.BeforeClass;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import static org.apache.hadoop.util.Shell.WINDOWS;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run collection of tests for the {@link FileContext}.
|
||||||
|
*/
|
||||||
|
public class TestAdlFileContextMainOperationsLive
|
||||||
|
extends FileContextMainOperationsBaseTest {
|
||||||
|
|
||||||
|
private static final String KEY_FILE_SYSTEM = "test.fs.adl.name";
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
public static void skipTestCheck() {
|
||||||
|
Assume.assumeTrue(AdlStorageConfiguration.isContractTestEnabled());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
Configuration conf = AdlStorageConfiguration.getConfiguration();
|
||||||
|
String fileSystem = conf.get(KEY_FILE_SYSTEM);
|
||||||
|
if (fileSystem == null || fileSystem.trim().length() == 0) {
|
||||||
|
throw new Exception("Default file system not configured.");
|
||||||
|
}
|
||||||
|
URI uri = new URI(fileSystem);
|
||||||
|
FileSystem fs = AdlStorageConfiguration.createStorageConnector();
|
||||||
|
fc = FileContext.getFileContext(
|
||||||
|
new DelegateToFileSystem(uri, fs, conf, fs.getScheme(), false) {
|
||||||
|
}, conf);
|
||||||
|
super.setUp();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected FileContextTestHelper createFileContextHelper() {
|
||||||
|
// On Windows, root directory path is created from local running directory.
|
||||||
|
// Adl does not support ':' as part of the path which results in failure.
|
||||||
|
// return new FileContextTestHelper(GenericTestUtils
|
||||||
|
// .getRandomizedTestDir()
|
||||||
|
// .getAbsolutePath().replaceAll(":",""));
|
||||||
|
return new FileContextTestHelper(UUID.randomUUID().toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected boolean listCorruptedBlocksSupported() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void testWorkingDirectory() throws Exception {
|
||||||
|
if (WINDOWS) {
|
||||||
|
// TODO :Fix is required in Hadoop shell to support windows permission
|
||||||
|
// set.
|
||||||
|
// The test is failing with NPE on windows platform only, with Linux
|
||||||
|
// platform test passes.
|
||||||
|
Assume.assumeTrue(false);
|
||||||
|
} else {
|
||||||
|
super.testWorkingDirectory();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void testUnsupportedSymlink() throws IOException {
|
||||||
|
Assume.assumeTrue(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSetVerifyChecksum() throws IOException {
|
||||||
|
Assume.assumeTrue(false);
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,12 +22,13 @@ package org.apache.hadoop.fs.adl.live;
|
||||||
import org.apache.hadoop.fs.FileSystem;
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
import org.apache.hadoop.fs.FileSystemContractBaseTest;
|
import org.apache.hadoop.fs.FileSystemContractBaseTest;
|
||||||
import org.apache.hadoop.fs.Path;
|
import org.apache.hadoop.fs.Path;
|
||||||
import org.junit.Test;
|
import org.junit.Assume;
|
||||||
|
import org.junit.Before;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Verify Adls adhere to Hadoop file system semantics.
|
* Test Base contract tests on Adl file system.
|
||||||
*/
|
*/
|
||||||
public class TestAdlFileSystemContractLive extends FileSystemContractBaseTest {
|
public class TestAdlFileSystemContractLive extends FileSystemContractBaseTest {
|
||||||
private FileSystem adlStore;
|
private FileSystem adlStore;
|
||||||
|
@ -60,52 +61,8 @@ public class TestAdlFileSystemContractLive extends FileSystemContractBaseTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testGetFileStatus() throws IOException {
|
@Before
|
||||||
if (!AdlStorageConfiguration.isContractTestEnabled()) {
|
public void skipTestCheck() {
|
||||||
return;
|
Assume.assumeTrue(AdlStorageConfiguration.isContractTestEnabled());
|
||||||
}
|
|
||||||
|
|
||||||
Path testPath = new Path("/test/adltest");
|
|
||||||
if (adlStore.exists(testPath)) {
|
|
||||||
adlStore.delete(testPath, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
adlStore.create(testPath).close();
|
|
||||||
assertTrue(adlStore.delete(testPath, false));
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
/**
|
|
||||||
* The following tests are failing on Azure Data Lake and the Azure Data Lake
|
|
||||||
* file system code needs to be modified to make them pass.
|
|
||||||
* A separate work item has been opened for this.
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
@Override
|
|
||||||
public void testMkdirsFailsForSubdirectoryOfExistingFile() throws Exception {
|
|
||||||
// BUG : Adl should return exception instead of false.
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Override
|
|
||||||
public void testMkdirsWithUmask() throws Exception {
|
|
||||||
// Support under implementation in Adl
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Override
|
|
||||||
public void testMoveFileUnderParent() throws Exception {
|
|
||||||
// BUG: Adl server should return expected status code.
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Override
|
|
||||||
public void testRenameFileToSelf() throws Exception {
|
|
||||||
// BUG: Adl server should return expected status code.
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
@Override
|
|
||||||
public void testRenameToDirWithSamePrefixAllowed() throws Exception {
|
|
||||||
// BUG: Adl server should return expected status code.
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,134 @@
|
||||||
|
/*
|
||||||
|
* 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.adl.live;
|
||||||
|
|
||||||
|
import org.apache.hadoop.fs.CommonConfigurationKeysPublic;
|
||||||
|
import org.apache.hadoop.fs.FileAlreadyExistsException;
|
||||||
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
|
import org.apache.hadoop.fs.Path;
|
||||||
|
import org.apache.hadoop.fs.adl.common.Parallelized;
|
||||||
|
import org.apache.hadoop.fs.permission.FsPermission;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Assume;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.junit.runners.Parameterized;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test createNonRecursive API.
|
||||||
|
*/
|
||||||
|
@RunWith(Parallelized.class)
|
||||||
|
public class TestAdlInternalCreateNonRecursive {
|
||||||
|
private Path inputFileName;
|
||||||
|
private FsPermission inputPermission;
|
||||||
|
private boolean inputOverride;
|
||||||
|
private boolean inputFileAlreadyExist;
|
||||||
|
private boolean inputParentAlreadyExist;
|
||||||
|
private Class<IOException> expectedExceptionType;
|
||||||
|
private FileSystem adlStore;
|
||||||
|
|
||||||
|
public TestAdlInternalCreateNonRecursive(String testScenario, String fileName,
|
||||||
|
FsPermission permission, boolean override, boolean fileAlreadyExist,
|
||||||
|
boolean parentAlreadyExist, Class<IOException> exceptionType) {
|
||||||
|
|
||||||
|
// Random parent path for each test so that parallel execution does not fail
|
||||||
|
// other running test.
|
||||||
|
inputFileName = new Path(
|
||||||
|
"/test/createNonRecursive/" + UUID.randomUUID().toString(), fileName);
|
||||||
|
inputPermission = permission;
|
||||||
|
inputFileAlreadyExist = fileAlreadyExist;
|
||||||
|
inputOverride = override;
|
||||||
|
inputParentAlreadyExist = parentAlreadyExist;
|
||||||
|
expectedExceptionType = exceptionType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Parameterized.Parameters(name = "{0}")
|
||||||
|
public static Collection adlCreateNonRecursiveTestData()
|
||||||
|
throws UnsupportedEncodingException {
|
||||||
|
/*
|
||||||
|
Test Data
|
||||||
|
File name, Permission, Override flag, File already exist, Parent
|
||||||
|
already exist
|
||||||
|
shouldCreateSucceed, expectedExceptionIfFileCreateFails
|
||||||
|
|
||||||
|
File already exist and Parent already exist are mutually exclusive.
|
||||||
|
*/
|
||||||
|
return Arrays.asList(new Object[][] {
|
||||||
|
{"CNR - When file do not exist.", UUID.randomUUID().toString(),
|
||||||
|
FsPermission.getFileDefault(), false, false, true, null},
|
||||||
|
{"CNR - When file exist. Override false", UUID.randomUUID().toString(),
|
||||||
|
FsPermission.getFileDefault(), false, true, true,
|
||||||
|
FileAlreadyExistsException.class},
|
||||||
|
{"CNR - When file exist. Override true", UUID.randomUUID().toString(),
|
||||||
|
FsPermission.getFileDefault(), true, true, true, null},
|
||||||
|
|
||||||
|
//TODO: This test is skipped till the fixes are not made it to prod.
|
||||||
|
/*{ "CNR - When parent do no exist.", UUID.randomUUID().toString(),
|
||||||
|
FsPermission.getFileDefault(), false, false, true, false,
|
||||||
|
IOException.class }*/});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
Assume.assumeTrue(AdlStorageConfiguration.isContractTestEnabled());
|
||||||
|
adlStore = AdlStorageConfiguration.createStorageConnector();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCreateNonRecursiveFunctionality() throws IOException {
|
||||||
|
if (inputFileAlreadyExist) {
|
||||||
|
FileSystem.create(adlStore, inputFileName, inputPermission);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mutually exclusive to inputFileAlreadyExist
|
||||||
|
if (inputParentAlreadyExist) {
|
||||||
|
adlStore.mkdirs(inputFileName.getParent());
|
||||||
|
} else {
|
||||||
|
adlStore.delete(inputFileName.getParent(), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
adlStore.createNonRecursive(inputFileName, inputPermission, inputOverride,
|
||||||
|
CommonConfigurationKeysPublic.IO_FILE_BUFFER_SIZE_DEFAULT,
|
||||||
|
adlStore.getDefaultReplication(inputFileName),
|
||||||
|
adlStore.getDefaultBlockSize(inputFileName), null);
|
||||||
|
} catch (IOException e) {
|
||||||
|
|
||||||
|
if (expectedExceptionType == null) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
Assert.assertEquals(expectedExceptionType, e.getClass());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (expectedExceptionType != null) {
|
||||||
|
Assert.fail("CreateNonRecursive should have failed with exception "
|
||||||
|
+ expectedExceptionType.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,116 @@
|
||||||
|
/*
|
||||||
|
* 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.adl.live;
|
||||||
|
|
||||||
|
import org.apache.hadoop.fs.CommonConfigurationKeys;
|
||||||
|
import org.apache.hadoop.fs.FileStatus;
|
||||||
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
|
import org.apache.hadoop.fs.Path;
|
||||||
|
import org.apache.hadoop.fs.adl.common.Parallelized;
|
||||||
|
import org.apache.hadoop.fs.permission.FsAction;
|
||||||
|
import org.apache.hadoop.fs.permission.FsPermission;
|
||||||
|
import org.junit.*;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.junit.runners.Parameterized;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test ACL permission on file/folder on Adl file system.
|
||||||
|
*/
|
||||||
|
@RunWith(Parallelized.class)
|
||||||
|
public class TestAdlPermissionLive {
|
||||||
|
|
||||||
|
private static Path testRoot = new Path("/test");
|
||||||
|
private FsPermission permission;
|
||||||
|
private Path path;
|
||||||
|
private FileSystem adlStore;
|
||||||
|
|
||||||
|
public TestAdlPermissionLive(FsPermission testPermission) {
|
||||||
|
permission = testPermission;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Parameterized.Parameters(name = "{0}")
|
||||||
|
public static Collection adlCreateNonRecursiveTestData()
|
||||||
|
throws UnsupportedEncodingException {
|
||||||
|
/*
|
||||||
|
Test Data
|
||||||
|
File/Folder name, User permission, Group permission, Other Permission,
|
||||||
|
Parent already exist
|
||||||
|
shouldCreateSucceed, expectedExceptionIfFileCreateFails
|
||||||
|
*/
|
||||||
|
final Collection<Object[]> datas = new ArrayList<>();
|
||||||
|
for (FsAction g : FsAction.values()) {
|
||||||
|
for (FsAction o : FsAction.values()) {
|
||||||
|
datas.add(new Object[] {new FsPermission(FsAction.ALL, g, o)});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return datas;
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void cleanUp() throws IOException, URISyntaxException {
|
||||||
|
if (AdlStorageConfiguration.isContractTestEnabled()) {
|
||||||
|
Assert.assertTrue(AdlStorageConfiguration.createStorageConnector()
|
||||||
|
.delete(testRoot, true));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
Assume.assumeTrue(AdlStorageConfiguration.isContractTestEnabled());
|
||||||
|
adlStore = AdlStorageConfiguration.createStorageConnector();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFilePermission() throws IOException {
|
||||||
|
path = new Path(testRoot, UUID.randomUUID().toString());
|
||||||
|
adlStore.getConf()
|
||||||
|
.set(CommonConfigurationKeys.FS_PERMISSIONS_UMASK_KEY, "000");
|
||||||
|
|
||||||
|
adlStore.mkdirs(path.getParent(),
|
||||||
|
new FsPermission(FsAction.ALL, FsAction.WRITE, FsAction.NONE));
|
||||||
|
adlStore.removeDefaultAcl(path.getParent());
|
||||||
|
|
||||||
|
adlStore.create(path, permission, true, 1024, (short) 1, 1023, null);
|
||||||
|
FileStatus status = adlStore.getFileStatus(path);
|
||||||
|
Assert.assertEquals(permission, status.getPermission());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFolderPermission() throws IOException {
|
||||||
|
path = new Path(testRoot, UUID.randomUUID().toString());
|
||||||
|
adlStore.getConf()
|
||||||
|
.set(CommonConfigurationKeys.FS_PERMISSIONS_UMASK_KEY, "000");
|
||||||
|
adlStore.mkdirs(path.getParent(),
|
||||||
|
new FsPermission(FsAction.ALL, FsAction.WRITE, FsAction.NONE));
|
||||||
|
adlStore.removeDefaultAcl(path.getParent());
|
||||||
|
|
||||||
|
adlStore.mkdirs(path, permission);
|
||||||
|
FileStatus status = adlStore.getFileStatus(path);
|
||||||
|
Assert.assertEquals(permission, status.getPermission());
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,334 @@
|
||||||
|
/*
|
||||||
|
* 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.adl.live;
|
||||||
|
|
||||||
|
import org.apache.hadoop.fs.FileStatus;
|
||||||
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
|
import org.apache.hadoop.fs.Path;
|
||||||
|
import org.apache.hadoop.fs.adl.common.Parallelized;
|
||||||
|
import org.junit.AfterClass;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.junit.runners.Parameterized;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.UnsupportedEncodingException;
|
||||||
|
import java.net.URISyntaxException;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test supported ASCII, UTF-8 character set supported by Adl storage file
|
||||||
|
* system on file/folder operation.
|
||||||
|
*/
|
||||||
|
@RunWith(Parallelized.class)
|
||||||
|
public class TestAdlSupportedCharsetInPath {
|
||||||
|
|
||||||
|
private static final String TEST_ROOT = "/test/";
|
||||||
|
private static final Logger LOG = LoggerFactory
|
||||||
|
.getLogger(TestAdlSupportedCharsetInPath.class);
|
||||||
|
private String path;
|
||||||
|
|
||||||
|
public TestAdlSupportedCharsetInPath(String filePath) {
|
||||||
|
path = filePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Parameterized.Parameters(name = "{0}")
|
||||||
|
public static Collection<Object[]> adlCharTestData()
|
||||||
|
throws UnsupportedEncodingException {
|
||||||
|
|
||||||
|
ArrayList<String> filePathList = new ArrayList<>();
|
||||||
|
for (int i = 32; i < 127; ++i) {
|
||||||
|
String specialChar = (char) i + "";
|
||||||
|
if (i >= 48 && i <= 57) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= 65 && i <= 90) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (i >= 97 && i <= 122) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Special char at start of the path
|
||||||
|
if (i != 92 && i != 58 && i != 46 && i != 47) {
|
||||||
|
filePathList.add(specialChar + "");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Special char at end of string
|
||||||
|
if (i != 92 && i != 47 && i != 58) {
|
||||||
|
filePathList.add("file " + i + " " + specialChar);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Special char in between string
|
||||||
|
if (i != 47 && i != 58 && i != 92) {
|
||||||
|
filePathList.add("file " + i + " " + specialChar + "_name");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
filePathList.add("a ");
|
||||||
|
filePathList.add("a..b");
|
||||||
|
fillUnicodes(filePathList);
|
||||||
|
Collection<Object[]> result = new ArrayList<>();
|
||||||
|
for (String item : filePathList) {
|
||||||
|
result.add(new Object[] {item});
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void fillUnicodes(ArrayList<String> filePathList) {
|
||||||
|
// Unicode characters
|
||||||
|
filePathList.add("البيانات الكبيرة"); // Arabic
|
||||||
|
filePathList.add("Të dhënat i madh"); // Albanian
|
||||||
|
filePathList.add("մեծ տվյալները"); // Armenian
|
||||||
|
filePathList.add("böyük data"); // Azerbaijani
|
||||||
|
filePathList.add("вялікія дадзеныя"); // Belarusian,
|
||||||
|
filePathList.add("বিগ ডেটা"); // Bengali
|
||||||
|
filePathList.add("veliki podataka"); // Bosnian
|
||||||
|
filePathList.add("голяма данни"); // Bulgarian
|
||||||
|
filePathList.add("大数据"); // Chinese - Simplified
|
||||||
|
filePathList.add("大數據"); // Chinese - Traditional
|
||||||
|
filePathList.add("დიდი მონაცემთა"); // Georgian,
|
||||||
|
filePathList.add("große Daten"); // German
|
||||||
|
filePathList.add("μεγάλο δεδομένα"); // Greek
|
||||||
|
filePathList.add("મોટા માહિતી"); // Gujarati
|
||||||
|
filePathList.add("נתונים גדולים"); // Hebrew
|
||||||
|
filePathList.add("बड़ा डेटा"); // Hindi
|
||||||
|
filePathList.add("stór gögn"); // Icelandic
|
||||||
|
filePathList.add("sonraí mór"); // Irish
|
||||||
|
filePathList.add("ビッグデータ"); // Japanese
|
||||||
|
filePathList.add("үлкен деректер"); // Kazakh
|
||||||
|
filePathList.add("ទិន្នន័យធំ"); // Khmer
|
||||||
|
filePathList.add("빅 데이터"); // Korean
|
||||||
|
filePathList.add("ຂໍ້ມູນ ຂະຫນາດໃຫຍ່"); // Lao
|
||||||
|
filePathList.add("големи податоци"); // Macedonian
|
||||||
|
filePathList.add("ठूलो डाटा"); // Nepali
|
||||||
|
filePathList.add("വലിയ ഡാറ്റ"); // Malayalam
|
||||||
|
filePathList.add("मोठे डेटा"); // Marathi
|
||||||
|
filePathList.add("том мэдээлэл"); // Mangolian
|
||||||
|
filePathList.add("اطلاعات بزرگ"); // Persian
|
||||||
|
filePathList.add("ਵੱਡੇ ਡਾਟੇ ਨੂੰ"); // Punjabi
|
||||||
|
filePathList.add("большие данные"); // Russian
|
||||||
|
filePathList.add("Велики података"); // Serbian
|
||||||
|
filePathList.add("විශාල දත්ත"); // Sinhala
|
||||||
|
filePathList.add("big dát"); // Slovak
|
||||||
|
filePathList.add("маълумоти калон"); // Tajik
|
||||||
|
filePathList.add("பெரிய தரவு"); // Tamil
|
||||||
|
filePathList.add("పెద్ద డేటా"); // Telugu
|
||||||
|
filePathList.add("ข้อมูลใหญ่"); // Thai
|
||||||
|
filePathList.add("büyük veri"); // Turkish
|
||||||
|
filePathList.add("великі дані"); // Ukranian
|
||||||
|
filePathList.add("بڑے اعداد و شمار"); // Urdu
|
||||||
|
filePathList.add("katta ma'lumotlar"); // Uzbek
|
||||||
|
filePathList.add("dữ liệu lớn"); // Vietanamese
|
||||||
|
filePathList.add("גרויס דאַטן"); // Yiddish
|
||||||
|
filePathList.add("big idatha"); // Zulu
|
||||||
|
filePathList.add("rachelχ");
|
||||||
|
filePathList.add("jessicaο");
|
||||||
|
filePathList.add("sarahδ");
|
||||||
|
filePathList.add("katieν");
|
||||||
|
filePathList.add("wendyξ");
|
||||||
|
filePathList.add("davidμ");
|
||||||
|
filePathList.add("priscillaυ");
|
||||||
|
filePathList.add("oscarθ");
|
||||||
|
filePathList.add("xavierχ");
|
||||||
|
filePathList.add("gabriellaθ");
|
||||||
|
filePathList.add("davidυ");
|
||||||
|
filePathList.add("ireneμ");
|
||||||
|
filePathList.add("fredρ");
|
||||||
|
filePathList.add("davidτ");
|
||||||
|
filePathList.add("ulyssesν");
|
||||||
|
filePathList.add("gabriellaμ");
|
||||||
|
filePathList.add("zachζ");
|
||||||
|
filePathList.add("gabriellaλ");
|
||||||
|
filePathList.add("ulyssesφ");
|
||||||
|
filePathList.add("davidχ");
|
||||||
|
filePathList.add("sarahσ");
|
||||||
|
filePathList.add("hollyψ");
|
||||||
|
filePathList.add("nickα");
|
||||||
|
filePathList.add("ulyssesι");
|
||||||
|
filePathList.add("mikeβ");
|
||||||
|
filePathList.add("priscillaκ");
|
||||||
|
filePathList.add("wendyθ");
|
||||||
|
filePathList.add("jessicaς");
|
||||||
|
filePathList.add("fredχ");
|
||||||
|
filePathList.add("fredζ");
|
||||||
|
filePathList.add("sarahκ");
|
||||||
|
filePathList.add("calvinη");
|
||||||
|
filePathList.add("xavierχ");
|
||||||
|
filePathList.add("yuriχ");
|
||||||
|
filePathList.add("ethanλ");
|
||||||
|
filePathList.add("hollyε");
|
||||||
|
filePathList.add("xavierσ");
|
||||||
|
filePathList.add("victorτ");
|
||||||
|
filePathList.add("wendyβ");
|
||||||
|
filePathList.add("jessicaς");
|
||||||
|
filePathList.add("quinnφ");
|
||||||
|
filePathList.add("xavierυ");
|
||||||
|
filePathList.add("nickι");
|
||||||
|
filePathList.add("rachelφ");
|
||||||
|
filePathList.add("oscarξ");
|
||||||
|
filePathList.add("zachδ");
|
||||||
|
filePathList.add("zachλ");
|
||||||
|
filePathList.add("rachelα");
|
||||||
|
filePathList.add("jessicaφ");
|
||||||
|
filePathList.add("lukeφ");
|
||||||
|
filePathList.add("tomζ");
|
||||||
|
filePathList.add("nickξ");
|
||||||
|
filePathList.add("nickκ");
|
||||||
|
filePathList.add("ethanδ");
|
||||||
|
filePathList.add("fredχ");
|
||||||
|
filePathList.add("priscillaθ");
|
||||||
|
filePathList.add("zachξ");
|
||||||
|
filePathList.add("xavierξ");
|
||||||
|
filePathList.add("zachψ");
|
||||||
|
filePathList.add("ethanα");
|
||||||
|
filePathList.add("oscarι");
|
||||||
|
filePathList.add("ireneδ");
|
||||||
|
filePathList.add("ireneζ");
|
||||||
|
filePathList.add("victorο");
|
||||||
|
filePathList.add("wendyβ");
|
||||||
|
filePathList.add("mikeσ");
|
||||||
|
filePathList.add("fredο");
|
||||||
|
filePathList.add("mikeη");
|
||||||
|
filePathList.add("sarahρ");
|
||||||
|
filePathList.add("quinnβ");
|
||||||
|
filePathList.add("mikeυ");
|
||||||
|
filePathList.add("nickζ");
|
||||||
|
filePathList.add("nickο");
|
||||||
|
filePathList.add("tomκ");
|
||||||
|
filePathList.add("bobλ");
|
||||||
|
filePathList.add("yuriπ");
|
||||||
|
filePathList.add("davidτ");
|
||||||
|
filePathList.add("quinnπ");
|
||||||
|
filePathList.add("mikeλ");
|
||||||
|
filePathList.add("davidη");
|
||||||
|
filePathList.add("ethanτ");
|
||||||
|
filePathList.add("nickφ");
|
||||||
|
filePathList.add("yuriο");
|
||||||
|
filePathList.add("ethanυ");
|
||||||
|
filePathList.add("bobθ");
|
||||||
|
filePathList.add("davidλ");
|
||||||
|
filePathList.add("priscillaξ");
|
||||||
|
filePathList.add("nickγ");
|
||||||
|
filePathList.add("lukeυ");
|
||||||
|
filePathList.add("ireneλ");
|
||||||
|
filePathList.add("xavierο");
|
||||||
|
filePathList.add("fredυ");
|
||||||
|
filePathList.add("ulyssesμ");
|
||||||
|
filePathList.add("wendyγ");
|
||||||
|
filePathList.add("zachλ");
|
||||||
|
filePathList.add("rachelς");
|
||||||
|
filePathList.add("sarahπ");
|
||||||
|
filePathList.add("aliceψ");
|
||||||
|
filePathList.add("bobτ");
|
||||||
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void testReport() throws IOException, URISyntaxException {
|
||||||
|
if (!AdlStorageConfiguration.isContractTestEnabled()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FileSystem fs = AdlStorageConfiguration.createStorageConnector();
|
||||||
|
fs.delete(new Path(TEST_ROOT), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAllowedSpecialCharactersMkdir()
|
||||||
|
throws IOException, URISyntaxException {
|
||||||
|
Path parentPath = new Path(TEST_ROOT, UUID.randomUUID().toString() + "/");
|
||||||
|
Path specialFile = new Path(parentPath, path);
|
||||||
|
FileSystem fs = AdlStorageConfiguration.createStorageConnector();
|
||||||
|
|
||||||
|
Assert.assertTrue("Mkdir failed : " + specialFile, fs.mkdirs(specialFile));
|
||||||
|
Assert.assertTrue("File not Found after Mkdir success" + specialFile,
|
||||||
|
fs.exists(specialFile));
|
||||||
|
Assert.assertTrue("Not listed under parent " + parentPath,
|
||||||
|
contains(fs.listStatus(parentPath),
|
||||||
|
fs.makeQualified(specialFile).toString()));
|
||||||
|
Assert.assertTrue("Delete failed : " + specialFile,
|
||||||
|
fs.delete(specialFile, true));
|
||||||
|
Assert.assertFalse("File still exist after delete " + specialFile,
|
||||||
|
fs.exists(specialFile));
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean contains(FileStatus[] statuses, String remotePath) {
|
||||||
|
for (FileStatus status : statuses) {
|
||||||
|
if (status.getPath().toString().equals(remotePath)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Arrays.stream(statuses).forEach(s -> LOG.info(s.getPath().toString()));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setup() throws Exception {
|
||||||
|
org.junit.Assume
|
||||||
|
.assumeTrue(AdlStorageConfiguration.isContractTestEnabled());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testAllowedSpecialCharactersRename()
|
||||||
|
throws IOException, URISyntaxException {
|
||||||
|
|
||||||
|
String parentPath = TEST_ROOT + UUID.randomUUID().toString() + "/";
|
||||||
|
Path specialFile = new Path(parentPath + path);
|
||||||
|
Path anotherLocation = new Path(parentPath + UUID.randomUUID().toString());
|
||||||
|
FileSystem fs = AdlStorageConfiguration.createStorageConnector();
|
||||||
|
|
||||||
|
Assert.assertTrue("Could not create " + specialFile.toString(),
|
||||||
|
fs.createNewFile(specialFile));
|
||||||
|
Assert.assertTrue(
|
||||||
|
"Failed to rename " + specialFile.toString() + " --> " + anotherLocation
|
||||||
|
.toString(), fs.rename(specialFile, anotherLocation));
|
||||||
|
Assert.assertFalse("File should not be present after successful rename : "
|
||||||
|
+ specialFile.toString(), fs.exists(specialFile));
|
||||||
|
Assert.assertTrue("File should be present after successful rename : "
|
||||||
|
+ anotherLocation.toString(), fs.exists(anotherLocation));
|
||||||
|
Assert.assertFalse(
|
||||||
|
"Listed under parent whereas expected not listed : " + parentPath,
|
||||||
|
contains(fs.listStatus(new Path(parentPath)),
|
||||||
|
fs.makeQualified(specialFile).toString()));
|
||||||
|
|
||||||
|
Assert.assertTrue(
|
||||||
|
"Failed to rename " + anotherLocation.toString() + " --> " + specialFile
|
||||||
|
.toString(), fs.rename(anotherLocation, specialFile));
|
||||||
|
Assert.assertTrue(
|
||||||
|
"File should be present after successful rename : " + "" + specialFile
|
||||||
|
.toString(), fs.exists(specialFile));
|
||||||
|
Assert.assertFalse("File should not be present after successful rename : "
|
||||||
|
+ anotherLocation.toString(), fs.exists(anotherLocation));
|
||||||
|
|
||||||
|
Assert.assertTrue("Not listed under parent " + parentPath,
|
||||||
|
contains(fs.listStatus(new Path(parentPath)),
|
||||||
|
fs.makeQualified(specialFile).toString()));
|
||||||
|
|
||||||
|
Assert.assertTrue("Failed to delete " + parentPath,
|
||||||
|
fs.delete(new Path(parentPath), true));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,111 @@
|
||||||
|
/*
|
||||||
|
* 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.adl.live;
|
||||||
|
|
||||||
|
import org.apache.hadoop.fs.ContentSummary;
|
||||||
|
import org.apache.hadoop.fs.FileStatus;
|
||||||
|
import org.apache.hadoop.fs.FileSystem;
|
||||||
|
import org.apache.hadoop.fs.Path;
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Assume;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is responsible for testing ContentSummary, ListStatus on
|
||||||
|
* file/folder.
|
||||||
|
*/
|
||||||
|
public class TestMetadata {
|
||||||
|
|
||||||
|
private FileSystem adlStore;
|
||||||
|
private Path parent;
|
||||||
|
|
||||||
|
public TestMetadata() {
|
||||||
|
parent = new Path("test");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
Assume.assumeTrue(AdlStorageConfiguration.isContractTestEnabled());
|
||||||
|
adlStore = AdlStorageConfiguration.createStorageConnector();
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void cleanUp() throws Exception {
|
||||||
|
if (AdlStorageConfiguration.isContractTestEnabled()) {
|
||||||
|
adlStore.delete(parent, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testContentSummaryOnFile() throws IOException {
|
||||||
|
Path child = new Path(UUID.randomUUID().toString());
|
||||||
|
Path testFile = new Path(parent, child);
|
||||||
|
OutputStream out = adlStore.create(testFile);
|
||||||
|
|
||||||
|
for (int i = 0; i < 1024; ++i) {
|
||||||
|
out.write(97);
|
||||||
|
}
|
||||||
|
out.close();
|
||||||
|
|
||||||
|
Assert.assertTrue(adlStore.isFile(testFile));
|
||||||
|
ContentSummary summary = adlStore.getContentSummary(testFile);
|
||||||
|
Assert.assertEquals(1024, summary.getSpaceConsumed());
|
||||||
|
Assert.assertEquals(1, summary.getFileCount());
|
||||||
|
Assert.assertEquals(0, summary.getDirectoryCount());
|
||||||
|
Assert.assertEquals(1024, summary.getLength());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testContentSummaryOnFolder() throws IOException {
|
||||||
|
Path child = new Path(UUID.randomUUID().toString());
|
||||||
|
Path testFile = new Path(parent, child);
|
||||||
|
OutputStream out = adlStore.create(testFile);
|
||||||
|
|
||||||
|
for (int i = 0; i < 1024; ++i) {
|
||||||
|
out.write(97);
|
||||||
|
}
|
||||||
|
out.close();
|
||||||
|
|
||||||
|
Assert.assertTrue(adlStore.isFile(testFile));
|
||||||
|
ContentSummary summary = adlStore.getContentSummary(parent);
|
||||||
|
Assert.assertEquals(1024, summary.getSpaceConsumed());
|
||||||
|
Assert.assertEquals(1, summary.getFileCount());
|
||||||
|
Assert.assertEquals(1, summary.getDirectoryCount());
|
||||||
|
Assert.assertEquals(1024, summary.getLength());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void listStatusOnFile() throws IOException {
|
||||||
|
Path path = new Path(parent, "a.txt");
|
||||||
|
FileSystem fs = adlStore;
|
||||||
|
fs.createNewFile(path);
|
||||||
|
Assert.assertTrue(fs.isFile(path));
|
||||||
|
FileStatus[] statuses = fs.listStatus(path);
|
||||||
|
Assert
|
||||||
|
.assertEquals(path.makeQualified(fs.getUri(), fs.getWorkingDirectory()),
|
||||||
|
statuses[0].getPath());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue