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

网格计算

开发平台:

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 junit.framework.TestCase;
  20. import java.io.File;
  21. import java.io.IOException;
  22. import java.io.DataOutputStream;
  23. import java.net.URI;
  24. import org.apache.hadoop.conf.Configuration;
  25. import org.apache.hadoop.fs.FileSystem;
  26. import org.apache.hadoop.fs.FsShell;
  27. import org.apache.hadoop.fs.Path;
  28. import org.apache.hadoop.fs.Trash;
  29. import org.apache.hadoop.fs.LocalFileSystem;
  30. /**
  31.  * This class tests commands from Trash.
  32.  */
  33. public class TestTrash extends TestCase {
  34.   private final static Path TEST_DIR =
  35.     new Path(new File(System.getProperty("test.build.data","/tmp")
  36.           ).toURI().toString().replace(' ', '+'), "testTrash");
  37.   protected static Path writeFile(FileSystem fs, Path f) throws IOException {
  38.     DataOutputStream out = fs.create(f);
  39.     out.writeBytes("dhruba: " + f);
  40.     out.close();
  41.     assertTrue(fs.exists(f));
  42.     return f;
  43.   }
  44.   protected static Path mkdir(FileSystem fs, Path p) throws IOException {
  45.     assertTrue(fs.mkdirs(p));
  46.     assertTrue(fs.exists(p));
  47.     assertTrue(fs.getFileStatus(p).isDir());
  48.     return p;
  49.   }
  50.   // check that the specified file is in Trash
  51.   protected static void checkTrash(FileSystem fs, Path trashRoot,
  52.       Path path) throws IOException {
  53.     Path p = new Path(trashRoot+"/"+ path.toUri().getPath());
  54.     assertTrue(fs.exists(p));
  55.   }
  56.   // check that the specified file is not in Trash
  57.   static void checkNotInTrash(FileSystem fs, Path trashRoot, String pathname)
  58.                               throws IOException {
  59.     Path p = new Path(trashRoot+"/"+ new Path(pathname).getName());
  60.     assertTrue(!fs.exists(p));
  61.   }
  62.   protected static void trashShell(final FileSystem fs, final Path base)
  63.       throws IOException {
  64.     Configuration conf = new Configuration();
  65.     conf.set("fs.trash.interval", "10"); // 10 minute
  66.     conf.set("fs.default.name", fs.getUri().toString());
  67.     FsShell shell = new FsShell();
  68.     shell.setConf(conf);
  69.     Path trashRoot = null;
  70.     // First create a new directory with mkdirs
  71.     Path myPath = new Path(base, "test/mkdirs");
  72.     mkdir(fs, myPath);
  73.     // Second, create a file in that directory.
  74.     Path myFile = new Path(base, "test/mkdirs/myFile");
  75.     writeFile(fs, myFile);
  76.     // Verify that expunge without Trash directory
  77.     // won't throw Exception
  78.     {
  79.       String[] args = new String[1];
  80.       args[0] = "-expunge";
  81.       int val = -1;
  82.       try {
  83.         val = shell.run(args);
  84.       } catch (Exception e) {
  85.         System.err.println("Exception raised from Trash.run " +
  86.                            e.getLocalizedMessage());
  87.       }
  88.       assertTrue(val == 0);
  89.     }
  90.     // Verify that we succeed in removing the file we created.
  91.     // This should go into Trash.
  92.     {
  93.       String[] args = new String[2];
  94.       args[0] = "-rm";
  95.       args[1] = myFile.toString();
  96.       int val = -1;
  97.       try {
  98.         val = shell.run(args);
  99.       } catch (Exception e) {
  100.         System.err.println("Exception raised from Trash.run " +
  101.                            e.getLocalizedMessage());
  102.       }
  103.       assertTrue(val == 0);
  104.       trashRoot = shell.getCurrentTrashDir();
  105.       checkTrash(fs, trashRoot, myFile);
  106.     }
  107.     // Verify that we can recreate the file
  108.     writeFile(fs, myFile);
  109.     // Verify that we succeed in removing the file we re-created
  110.     {
  111.       String[] args = new String[2];
  112.       args[0] = "-rm";
  113.       args[1] = new Path(base, "test/mkdirs/myFile").toString();
  114.       int val = -1;
  115.       try {
  116.         val = shell.run(args);
  117.       } catch (Exception e) {
  118.         System.err.println("Exception raised from Trash.run " +
  119.                            e.getLocalizedMessage());
  120.       }
  121.       assertTrue(val == 0);
  122.     }
  123.     // Verify that we can recreate the file
  124.     writeFile(fs, myFile);
  125.     // Verify that we succeed in removing the whole directory
  126.     // along with the file inside it.
  127.     {
  128.       String[] args = new String[2];
  129.       args[0] = "-rmr";
  130.       args[1] = new Path(base, "test/mkdirs").toString();
  131.       int val = -1;
  132.       try {
  133.         val = shell.run(args);
  134.       } catch (Exception e) {
  135.         System.err.println("Exception raised from Trash.run " +
  136.                            e.getLocalizedMessage());
  137.       }
  138.       assertTrue(val == 0);
  139.     }
  140.     // recreate directory
  141.     mkdir(fs, myPath);
  142.     // Verify that we succeed in removing the whole directory
  143.     {
  144.       String[] args = new String[2];
  145.       args[0] = "-rmr";
  146.       args[1] = new Path(base, "test/mkdirs").toString();
  147.       int val = -1;
  148.       try {
  149.         val = shell.run(args);
  150.       } catch (Exception e) {
  151.         System.err.println("Exception raised from Trash.run " +
  152.                            e.getLocalizedMessage());
  153.       }
  154.       assertTrue(val == 0);
  155.     }
  156.     // Check that we can delete a file from the trash
  157.     {
  158.         Path toErase = new Path(trashRoot, "toErase");
  159.         int retVal = -1;
  160.         writeFile(fs, toErase);
  161.         try {
  162.           retVal = shell.run(new String[] {"-rm", toErase.toString()});
  163.         } catch (Exception e) {
  164.           System.err.println("Exception raised from Trash.run " +
  165.                              e.getLocalizedMessage());
  166.         }
  167.         assertTrue(retVal == 0);
  168.         checkNotInTrash (fs, trashRoot, toErase.toString());
  169.         checkNotInTrash (fs, trashRoot, toErase.toString()+".1");
  170.     }
  171.     // simulate Trash removal
  172.     {
  173.       String[] args = new String[1];
  174.       args[0] = "-expunge";
  175.       int val = -1;
  176.       try {
  177.         val = shell.run(args);
  178.       } catch (Exception e) {
  179.         System.err.println("Exception raised from Trash.run " +
  180.                            e.getLocalizedMessage());
  181.       }
  182.       assertTrue(val == 0);
  183.     }
  184.     // verify that after expunging the Trash, it really goes away
  185.     checkNotInTrash(fs, trashRoot, new Path(base, "test/mkdirs/myFile").toString());
  186.     // recreate directory and file
  187.     mkdir(fs, myPath);
  188.     writeFile(fs, myFile);
  189.     // remove file first, then remove directory
  190.     {
  191.       String[] args = new String[2];
  192.       args[0] = "-rm";
  193.       args[1] = myFile.toString();
  194.       int val = -1;
  195.       try {
  196.         val = shell.run(args);
  197.       } catch (Exception e) {
  198.         System.err.println("Exception raised from Trash.run " +
  199.                            e.getLocalizedMessage());
  200.       }
  201.       assertTrue(val == 0);
  202.       checkTrash(fs, trashRoot, myFile);
  203.       args = new String[2];
  204.       args[0] = "-rmr";
  205.       args[1] = myPath.toString();
  206.       val = -1;
  207.       try {
  208.         val = shell.run(args);
  209.       } catch (Exception e) {
  210.         System.err.println("Exception raised from Trash.run " +
  211.                            e.getLocalizedMessage());
  212.       }
  213.       assertTrue(val == 0);
  214.       checkTrash(fs, trashRoot, myPath);
  215.     }
  216.     // attempt to remove parent of trash
  217.     {
  218.       String[] args = new String[2];
  219.       args[0] = "-rmr";
  220.       args[1] = trashRoot.getParent().getParent().toString();
  221.       int val = -1;
  222.       try {
  223.         val = shell.run(args);
  224.       } catch (Exception e) {
  225.         System.err.println("Exception raised from Trash.run " +
  226.                            e.getLocalizedMessage());
  227.       }
  228.       assertTrue(val == -1);
  229.       assertTrue(fs.exists(trashRoot));
  230.     }
  231.   }
  232.   public static void trashNonDefaultFS(Configuration conf) throws IOException {
  233.     conf.set("fs.trash.interval", "10"); // 10 minute
  234.     // attempt non-default FileSystem trash
  235.     {
  236.       final FileSystem lfs = FileSystem.getLocal(conf);
  237.       Path p = TEST_DIR;
  238.       Path f = new Path(p, "foo/bar");
  239.       if (lfs.exists(p)) {
  240.         lfs.delete(p, true);
  241.       }
  242.       try {
  243.         f = writeFile(lfs, f);
  244.         FileSystem.closeAll();
  245.         FileSystem localFs = FileSystem.get(URI.create("file:///"), conf);
  246.         Trash lTrash = new Trash(localFs, conf);
  247.         lTrash.moveToTrash(f.getParent());
  248.         checkTrash(localFs, lTrash.getCurrentTrashDir(), f);
  249.       } finally {
  250.         if (lfs.exists(p)) {
  251.           lfs.delete(p, true);
  252.         }
  253.       }
  254.     }
  255.   }
  256.   public void testTrash() throws IOException {
  257.     Configuration conf = new Configuration();
  258.     conf.setClass("fs.file.impl", TestLFS.class, FileSystem.class);
  259.     trashShell(FileSystem.getLocal(conf), TEST_DIR);
  260.   }
  261.   public void testNonDefaultFS() throws IOException {
  262.     Configuration conf = new Configuration();
  263.     conf.setClass("fs.file.impl", TestLFS.class, FileSystem.class);
  264.     conf.set("fs.default.name", "invalid://host/bar/foo");
  265.     trashNonDefaultFS(conf);
  266.   }
  267.   static class TestLFS extends LocalFileSystem {
  268.     Path home;
  269.     TestLFS() {
  270.       this(TEST_DIR);
  271.     }
  272.     TestLFS(Path home) {
  273.       super();
  274.       this.home = home;
  275.     }
  276.     public Path getHomeDirectory() {
  277.       return home;
  278.     }
  279.   }
  280. }