FileSystemContractBaseTest.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:14k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.fs;
  19. import java.io.FileNotFoundException;
  20. import java.io.IOException;
  21. import junit.framework.TestCase;
  22. import org.apache.hadoop.fs.FSDataInputStream;
  23. import org.apache.hadoop.fs.FSDataOutputStream;
  24. import org.apache.hadoop.fs.FileStatus;
  25. import org.apache.hadoop.fs.FileSystem;
  26. import org.apache.hadoop.fs.Path;
  27. /**
  28.  * <p>
  29.  * A collection of tests for the contract of the {@link FileSystem}.
  30.  * This test should be used for general-purpose implementations of
  31.  * {@link FileSystem}, that is, implementations that provide implementations 
  32.  * of all of the functionality of {@link FileSystem}.
  33.  * </p>
  34.  * <p>
  35.  * To test a given {@link FileSystem} implementation create a subclass of this
  36.  * test and override {@link #setUp()} to initialize the <code>fs</code> 
  37.  * {@link FileSystem} instance variable.
  38.  * </p>
  39.  */
  40. public abstract class FileSystemContractBaseTest extends TestCase {
  41.   
  42.   protected FileSystem fs;
  43.   private byte[] data = new byte[getBlockSize() * 2]; // two blocks of data
  44.   {
  45.     for (int i = 0; i < data.length; i++) {
  46.       data[i] = (byte) (i % 10);
  47.     }
  48.   }
  49.   
  50.   @Override
  51.   protected void tearDown() throws Exception {
  52.     fs.delete(path("/test"), true);
  53.   }
  54.   
  55.   protected int getBlockSize() {
  56.     return 1024;
  57.   }
  58.   
  59.   protected String getDefaultWorkingDirectory() {
  60.     return "/user/" + System.getProperty("user.name");
  61.   }
  62.   protected boolean renameSupported() {
  63.     return true;
  64.   }
  65.   
  66.   public void testWorkingDirectory() throws Exception {
  67.     Path workDir = path(getDefaultWorkingDirectory());
  68.     assertEquals(workDir, fs.getWorkingDirectory());
  69.     fs.setWorkingDirectory(path("."));
  70.     assertEquals(workDir, fs.getWorkingDirectory());
  71.     fs.setWorkingDirectory(path(".."));
  72.     assertEquals(workDir.getParent(), fs.getWorkingDirectory());
  73.     Path relativeDir = path("hadoop");
  74.     fs.setWorkingDirectory(relativeDir);
  75.     assertEquals(relativeDir, fs.getWorkingDirectory());
  76.     
  77.     Path absoluteDir = path("/test/hadoop");
  78.     fs.setWorkingDirectory(absoluteDir);
  79.     assertEquals(absoluteDir, fs.getWorkingDirectory());
  80.   }
  81.   
  82.   public void testMkdirs() throws Exception {
  83.     Path testDir = path("/test/hadoop");
  84.     assertFalse(fs.exists(testDir));
  85.     assertFalse(fs.isFile(testDir));
  86.     assertTrue(fs.mkdirs(testDir));
  87.     assertTrue(fs.exists(testDir));
  88.     assertFalse(fs.isFile(testDir));
  89.     
  90.     assertTrue(fs.mkdirs(testDir));
  91.     assertTrue(fs.exists(testDir));
  92.     assertFalse(fs.isFile(testDir));
  93.     Path parentDir = testDir.getParent();
  94.     assertTrue(fs.exists(parentDir));
  95.     assertFalse(fs.isFile(parentDir));
  96.     Path grandparentDir = parentDir.getParent();
  97.     assertTrue(fs.exists(grandparentDir));
  98.     assertFalse(fs.isFile(grandparentDir));
  99.     
  100.   }
  101.   
  102.   public void testMkdirsFailsForSubdirectoryOfExistingFile() throws Exception {
  103.     Path testDir = path("/test/hadoop");
  104.     assertFalse(fs.exists(testDir));
  105.     assertTrue(fs.mkdirs(testDir));
  106.     assertTrue(fs.exists(testDir));
  107.     
  108.     createFile(path("/test/hadoop/file"));
  109.     
  110.     Path testSubDir = path("/test/hadoop/file/subdir");
  111.     try {
  112.       fs.mkdirs(testSubDir);
  113.       fail("Should throw IOException.");
  114.     } catch (IOException e) {
  115.       // expected
  116.     }
  117.     assertFalse(fs.exists(testSubDir));
  118.     
  119.     Path testDeepSubDir = path("/test/hadoop/file/deep/sub/dir");
  120.     try {
  121.       fs.mkdirs(testDeepSubDir);
  122.       fail("Should throw IOException.");
  123.     } catch (IOException e) {
  124.       // expected
  125.     }
  126.     assertFalse(fs.exists(testDeepSubDir));
  127.     
  128.   }
  129.   
  130.   public void testGetFileStatusThrowsExceptionForNonExistentFile() 
  131.     throws Exception {
  132.     try {
  133.       fs.getFileStatus(path("/test/hadoop/file"));
  134.       fail("Should throw FileNotFoundException");
  135.     } catch (FileNotFoundException e) {
  136.       // expected
  137.     }
  138.   }
  139.   
  140.   public void testListStatusReturnsNullForNonExistentFile() throws Exception {
  141.     assertNull(fs.listStatus(path("/test/hadoop/file")));
  142.   }
  143.   
  144.   public void testListStatus() throws Exception {
  145.     Path[] testDirs = { path("/test/hadoop/a"),
  146.                         path("/test/hadoop/b"),
  147.                         path("/test/hadoop/c/1"), };
  148.     assertFalse(fs.exists(testDirs[0]));
  149.     for (Path path : testDirs) {
  150.       assertTrue(fs.mkdirs(path));
  151.     }
  152.     FileStatus[] paths = fs.listStatus(path("/test"));
  153.     assertEquals(1, paths.length);
  154.     assertEquals(path("/test/hadoop"), paths[0].getPath());
  155.     paths = fs.listStatus(path("/test/hadoop"));
  156.     assertEquals(3, paths.length);
  157.     assertEquals(path("/test/hadoop/a"), paths[0].getPath());
  158.     assertEquals(path("/test/hadoop/b"), paths[1].getPath());
  159.     assertEquals(path("/test/hadoop/c"), paths[2].getPath());
  160.     paths = fs.listStatus(path("/test/hadoop/a"));
  161.     assertEquals(0, paths.length);
  162.   }
  163.   
  164.   public void testWriteReadAndDeleteEmptyFile() throws Exception {
  165.     writeReadAndDelete(0);
  166.   }
  167.   public void testWriteReadAndDeleteHalfABlock() throws Exception {
  168.     writeReadAndDelete(getBlockSize() / 2);
  169.   }
  170.   public void testWriteReadAndDeleteOneBlock() throws Exception {
  171.     writeReadAndDelete(getBlockSize());
  172.   }
  173.   
  174.   public void testWriteReadAndDeleteOneAndAHalfBlocks() throws Exception {
  175.     writeReadAndDelete(getBlockSize() + (getBlockSize() / 2));
  176.   }
  177.   
  178.   public void testWriteReadAndDeleteTwoBlocks() throws Exception {
  179.     writeReadAndDelete(getBlockSize() * 2);
  180.   }
  181.   
  182.   private void writeReadAndDelete(int len) throws IOException {
  183.     Path path = path("/test/hadoop/file");
  184.     
  185.     fs.mkdirs(path.getParent());
  186.     FSDataOutputStream out = fs.create(path, false,
  187.         fs.getConf().getInt("io.file.buffer.size", 4096), 
  188.         (short) 1, getBlockSize());
  189.     out.write(data, 0, len);
  190.     out.close();
  191.     assertTrue("Exists", fs.exists(path));
  192.     assertEquals("Length", len, fs.getFileStatus(path).getLen());
  193.     FSDataInputStream in = fs.open(path);
  194.     byte[] buf = new byte[len];
  195.     in.readFully(0, buf);
  196.     in.close();
  197.     assertEquals(len, buf.length);
  198.     for (int i = 0; i < buf.length; i++) {
  199.       assertEquals("Position " + i, data[i], buf[i]);
  200.     }
  201.     
  202.     assertTrue("Deleted", fs.delete(path, false));
  203.     
  204.     assertFalse("No longer exists", fs.exists(path));
  205.   }
  206.   
  207.   public void testOverwrite() throws IOException {
  208.     Path path = path("/test/hadoop/file");
  209.     
  210.     fs.mkdirs(path.getParent());
  211.     createFile(path);
  212.     
  213.     assertTrue("Exists", fs.exists(path));
  214.     assertEquals("Length", data.length, fs.getFileStatus(path).getLen());
  215.     
  216.     try {
  217.       fs.create(path, false);
  218.       fail("Should throw IOException.");
  219.     } catch (IOException e) {
  220.       // Expected
  221.     }
  222.     
  223.     FSDataOutputStream out = fs.create(path, true);
  224.     out.write(data, 0, data.length);
  225.     out.close();
  226.     
  227.     assertTrue("Exists", fs.exists(path));
  228.     assertEquals("Length", data.length, fs.getFileStatus(path).getLen());
  229.     
  230.   }
  231.   
  232.   public void testWriteInNonExistentDirectory() throws IOException {
  233.     Path path = path("/test/hadoop/file");
  234.     assertFalse("Parent doesn't exist", fs.exists(path.getParent()));
  235.     createFile(path);
  236.     
  237.     assertTrue("Exists", fs.exists(path));
  238.     assertEquals("Length", data.length, fs.getFileStatus(path).getLen());
  239.     assertTrue("Parent exists", fs.exists(path.getParent()));
  240.   }
  241.   public void testDeleteNonExistentFile() throws IOException {
  242.     Path path = path("/test/hadoop/file");    
  243.     assertFalse("Doesn't exist", fs.exists(path));
  244.     assertFalse("No deletion", fs.delete(path, true));
  245.   }
  246.   
  247.   public void testDeleteRecursively() throws IOException {
  248.     Path dir = path("/test/hadoop");
  249.     Path file = path("/test/hadoop/file");
  250.     Path subdir = path("/test/hadoop/subdir");
  251.     
  252.     createFile(file);
  253.     assertTrue("Created subdir", fs.mkdirs(subdir));
  254.     
  255.     assertTrue("File exists", fs.exists(file));
  256.     assertTrue("Dir exists", fs.exists(dir));
  257.     assertTrue("Subdir exists", fs.exists(subdir));
  258.     
  259.     try {
  260.       fs.delete(dir, false);
  261.       fail("Should throw IOException.");
  262.     } catch (IOException e) {
  263.       // expected
  264.     }
  265.     assertTrue("File still exists", fs.exists(file));
  266.     assertTrue("Dir still exists", fs.exists(dir));
  267.     assertTrue("Subdir still exists", fs.exists(subdir));
  268.     
  269.     assertTrue("Deleted", fs.delete(dir, true));
  270.     assertFalse("File doesn't exist", fs.exists(file));
  271.     assertFalse("Dir doesn't exist", fs.exists(dir));
  272.     assertFalse("Subdir doesn't exist", fs.exists(subdir));
  273.   }
  274.   
  275.   public void testDeleteEmptyDirectory() throws IOException {
  276.     Path dir = path("/test/hadoop");
  277.     assertTrue(fs.mkdirs(dir));
  278.     assertTrue("Dir exists", fs.exists(dir));
  279.     assertTrue("Deleted", fs.delete(dir, false));
  280.     assertFalse("Dir doesn't exist", fs.exists(dir));
  281.   }
  282.   
  283.   public void testRenameNonExistentPath() throws Exception {
  284.     if (!renameSupported()) return;
  285.     
  286.     Path src = path("/test/hadoop/path");
  287.     Path dst = path("/test/new/newpath");
  288.     rename(src, dst, false, false, false);
  289.   }
  290.   public void testRenameFileMoveToNonExistentDirectory() throws Exception {
  291.     if (!renameSupported()) return;
  292.     
  293.     Path src = path("/test/hadoop/file");
  294.     createFile(src);
  295.     Path dst = path("/test/new/newfile");
  296.     rename(src, dst, false, true, false);
  297.   }
  298.   public void testRenameFileMoveToExistingDirectory() throws Exception {
  299.     if (!renameSupported()) return;
  300.     
  301.     Path src = path("/test/hadoop/file");
  302.     createFile(src);
  303.     Path dst = path("/test/new/newfile");
  304.     fs.mkdirs(dst.getParent());
  305.     rename(src, dst, true, false, true);
  306.   }
  307.   public void testRenameFileAsExistingFile() throws Exception {
  308.     if (!renameSupported()) return;
  309.     
  310.     Path src = path("/test/hadoop/file");
  311.     createFile(src);
  312.     Path dst = path("/test/new/newfile");
  313.     createFile(dst);
  314.     rename(src, dst, false, true, true);
  315.   }
  316.   public void testRenameFileAsExistingDirectory() throws Exception {
  317.     if (!renameSupported()) return;
  318.     
  319.     Path src = path("/test/hadoop/file");
  320.     createFile(src);
  321.     Path dst = path("/test/new/newdir");
  322.     fs.mkdirs(dst);
  323.     rename(src, dst, true, false, true);
  324.     assertTrue("Destination changed",
  325.         fs.exists(path("/test/new/newdir/file")));
  326.   }
  327.   
  328.   public void testRenameDirectoryMoveToNonExistentDirectory() 
  329.     throws Exception {
  330.     if (!renameSupported()) return;
  331.     
  332.     Path src = path("/test/hadoop/dir");
  333.     fs.mkdirs(src);
  334.     Path dst = path("/test/new/newdir");
  335.     rename(src, dst, false, true, false);
  336.   }
  337.   
  338.   public void testRenameDirectoryMoveToExistingDirectory() throws Exception {
  339.     if (!renameSupported()) return;
  340.     
  341.     Path src = path("/test/hadoop/dir");
  342.     fs.mkdirs(src);
  343.     createFile(path("/test/hadoop/dir/file1"));
  344.     createFile(path("/test/hadoop/dir/subdir/file2"));
  345.     
  346.     Path dst = path("/test/new/newdir");
  347.     fs.mkdirs(dst.getParent());
  348.     rename(src, dst, true, false, true);
  349.     
  350.     assertFalse("Nested file1 exists",
  351.         fs.exists(path("/test/hadoop/dir/file1")));
  352.     assertFalse("Nested file2 exists",
  353.         fs.exists(path("/test/hadoop/dir/subdir/file2")));
  354.     assertTrue("Renamed nested file1 exists",
  355.         fs.exists(path("/test/new/newdir/file1")));
  356.     assertTrue("Renamed nested exists",
  357.         fs.exists(path("/test/new/newdir/subdir/file2")));
  358.   }
  359.   
  360.   public void testRenameDirectoryAsExistingFile() throws Exception {
  361.     if (!renameSupported()) return;
  362.     
  363.     Path src = path("/test/hadoop/dir");
  364.     fs.mkdirs(src);
  365.     Path dst = path("/test/new/newfile");
  366.     createFile(dst);
  367.     rename(src, dst, false, true, true);
  368.   }
  369.   
  370.   public void testRenameDirectoryAsExistingDirectory() throws Exception {
  371.     if (!renameSupported()) return;
  372.     
  373.     Path src = path("/test/hadoop/dir");
  374.     fs.mkdirs(src);
  375.     createFile(path("/test/hadoop/dir/file1"));
  376.     createFile(path("/test/hadoop/dir/subdir/file2"));
  377.     
  378.     Path dst = path("/test/new/newdir");
  379.     fs.mkdirs(dst);
  380.     rename(src, dst, true, false, true);
  381.     assertTrue("Destination changed",
  382.         fs.exists(path("/test/new/newdir/dir")));    
  383.     assertFalse("Nested file1 exists",
  384.         fs.exists(path("/test/hadoop/dir/file1")));
  385.     assertFalse("Nested file2 exists",
  386.         fs.exists(path("/test/hadoop/dir/subdir/file2")));
  387.     assertTrue("Renamed nested file1 exists",
  388.         fs.exists(path("/test/new/newdir/dir/file1")));
  389.     assertTrue("Renamed nested exists",
  390.         fs.exists(path("/test/new/newdir/dir/subdir/file2")));
  391.   }
  392.   public void testInputStreamClosedTwice() throws IOException {
  393.     //HADOOP-4760 according to Closeable#close() closing already-closed 
  394.     //streams should have no effect. 
  395.     Path src = path("/test/hadoop/file");
  396.     createFile(src);
  397.     FSDataInputStream in = fs.open(src);
  398.     in.close();
  399.     in.close();
  400.   }
  401.   
  402.   public void testOutputStreamClosedTwice() throws IOException {
  403.     //HADOOP-4760 according to Closeable#close() closing already-closed 
  404.     //streams should have no effect. 
  405.     Path src = path("/test/hadoop/file");
  406.     FSDataOutputStream out = fs.create(src);
  407.     out.writeChar('H'); //write some data
  408.     out.close();
  409.     out.close();
  410.   }
  411.   
  412.   protected Path path(String pathString) {
  413.     return new Path(pathString).makeQualified(fs);
  414.   }
  415.   
  416.   protected void createFile(Path path) throws IOException {
  417.     FSDataOutputStream out = fs.create(path);
  418.     out.write(data, 0, data.length);
  419.     out.close();
  420.   }
  421.   
  422.   private void rename(Path src, Path dst, boolean renameSucceeded,
  423.       boolean srcExists, boolean dstExists) throws IOException {
  424.     assertEquals("Rename result", renameSucceeded, fs.rename(src, dst));
  425.     assertEquals("Source exists", srcExists, fs.exists(src));
  426.     assertEquals("Destination exists", dstExists, fs.exists(dst));
  427.   }
  428. }