blob: f94fa1b64557e6b974f0991e94dfcc8f2980c98a [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.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;
}
}
for (FileStatus status : statuses) {
LOG.info(status.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));
}
}