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

网格计算

开发平台:

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.hdfs;
  19. import java.io.ByteArrayOutputStream;
  20. import java.io.DataOutputStream;
  21. import java.io.File;
  22. import java.io.IOException;
  23. import java.io.OutputStream;
  24. import java.io.PrintStream;
  25. import java.io.PrintWriter;
  26. import java.security.Permission;
  27. import java.util.ArrayList;
  28. import java.util.Arrays;
  29. import java.util.List;
  30. import java.util.Random;
  31. import java.util.Scanner;
  32. import java.util.zip.GZIPOutputStream;
  33. import junit.framework.TestCase;
  34. import org.apache.hadoop.conf.Configuration;
  35. import org.apache.hadoop.fs.FSInputChecker;
  36. import org.apache.hadoop.fs.FileSystem;
  37. import org.apache.hadoop.fs.FsShell;
  38. import org.apache.hadoop.fs.Path;
  39. import org.apache.hadoop.fs.permission.FsPermission;
  40. import org.apache.hadoop.fs.shell.Count;
  41. import org.apache.hadoop.hdfs.protocol.Block;
  42. import org.apache.hadoop.hdfs.server.datanode.DataNode;
  43. import org.apache.hadoop.hdfs.server.datanode.FSDataset;
  44. import org.apache.hadoop.io.IOUtils;
  45. import org.apache.hadoop.security.UnixUserGroupInformation;
  46. import org.apache.hadoop.security.UserGroupInformation;
  47. import org.apache.hadoop.util.StringUtils;
  48. import org.apache.hadoop.util.ToolRunner;
  49. /**
  50.  * This class tests commands from DFSShell.
  51.  */
  52. public class TestDFSShell extends TestCase {
  53.   static final String TEST_ROOT_DIR =
  54.     new Path(System.getProperty("test.build.data","/tmp"))
  55.     .toString().replace(' ', '+');
  56.   static Path writeFile(FileSystem fs, Path f) throws IOException {
  57.     DataOutputStream out = fs.create(f);
  58.     out.writeBytes("dhruba: " + f);
  59.     out.close();
  60.     assertTrue(fs.exists(f));
  61.     return f;
  62.   }
  63.   static Path mkdir(FileSystem fs, Path p) throws IOException {
  64.     assertTrue(fs.mkdirs(p));
  65.     assertTrue(fs.exists(p));
  66.     assertTrue(fs.getFileStatus(p).isDir());
  67.     return p;
  68.   }
  69.   static File createLocalFile(File f) throws IOException {
  70.     assertTrue(!f.exists());
  71.     PrintWriter out = new PrintWriter(f);
  72.     out.print("createLocalFile: " + f.getAbsolutePath());
  73.     out.flush();
  74.     out.close();
  75.     assertTrue(f.exists());
  76.     assertTrue(f.isFile());
  77.     return f;
  78.   }
  79.   static void show(String s) {
  80.     System.out.println(Thread.currentThread().getStackTrace()[2] + " " + s);
  81.   }
  82.   public void testZeroSizeFile() throws IOException {
  83.     Configuration conf = new Configuration();
  84.     MiniDFSCluster cluster = new MiniDFSCluster(conf, 2, true, null);
  85.     FileSystem fs = cluster.getFileSystem();
  86.     assertTrue("Not a HDFS: "+fs.getUri(),
  87.                fs instanceof DistributedFileSystem);
  88.     final DistributedFileSystem dfs = (DistributedFileSystem)fs;
  89.     try {
  90.       //create a zero size file
  91.       final File f1 = new File(TEST_ROOT_DIR, "f1");
  92.       assertTrue(!f1.exists());
  93.       assertTrue(f1.createNewFile());
  94.       assertTrue(f1.exists());
  95.       assertTrue(f1.isFile());
  96.       assertEquals(0L, f1.length());
  97.       
  98.       //copy to remote
  99.       final Path root = mkdir(dfs, new Path("/test/zeroSizeFile"));
  100.       final Path remotef = new Path(root, "dst");
  101.       show("copy local " + f1 + " to remote " + remotef);
  102.       dfs.copyFromLocalFile(false, false, new Path(f1.getPath()), remotef);
  103.       
  104.       //getBlockSize() should not throw exception
  105.       show("Block size = " + dfs.getFileStatus(remotef).getBlockSize());
  106.       //copy back
  107.       final File f2 = new File(TEST_ROOT_DIR, "f2");
  108.       assertTrue(!f2.exists());
  109.       dfs.copyToLocalFile(remotef, new Path(f2.getPath()));
  110.       assertTrue(f2.exists());
  111.       assertTrue(f2.isFile());
  112.       assertEquals(0L, f2.length());
  113.   
  114.       f1.delete();
  115.       f2.delete();
  116.     } finally {
  117.       try {dfs.close();} catch (Exception e) {}
  118.       cluster.shutdown();
  119.     }
  120.   }
  121.   
  122.   public void testRecrusiveRm() throws IOException {
  123.   Configuration conf = new Configuration();
  124.   MiniDFSCluster cluster = new MiniDFSCluster(conf, 2, true, null);
  125.   FileSystem fs = cluster.getFileSystem();
  126.   assertTrue("Not a HDFS: " + fs.getUri(), 
  127.   fs instanceof DistributedFileSystem);
  128.   try {
  129.       fs.mkdirs(new Path(new Path("parent"), "child"));
  130.       try {
  131.         fs.delete(new Path("parent"), false);
  132.         assert(false); // should never reach here.
  133.       } catch(IOException e) {
  134.          //should have thrown an exception
  135.       }
  136.       try {
  137.         fs.delete(new Path("parent"), true);
  138.       } catch(IOException e) {
  139.         assert(false);
  140.       }
  141.     } finally {  
  142.       try { fs.close();}catch(IOException e){};
  143.       cluster.shutdown();
  144.     }
  145.   }
  146.     
  147.   public void testDu() throws IOException {
  148.     Configuration conf = new Configuration();
  149.     MiniDFSCluster cluster = new MiniDFSCluster(conf, 2, true, null);
  150.     FileSystem fs = cluster.getFileSystem();
  151.     assertTrue("Not a HDFS: "+fs.getUri(),
  152.                 fs instanceof DistributedFileSystem);
  153.     final DistributedFileSystem dfs = (DistributedFileSystem)fs;
  154.     PrintStream psBackup = System.out;
  155.     ByteArrayOutputStream out = new ByteArrayOutputStream();
  156.     PrintStream psOut = new PrintStream(out);
  157.     System.setOut(psOut);
  158.     FsShell shell = new FsShell();
  159.     shell.setConf(conf);
  160.     
  161.     try {
  162.       Path myPath = new Path("/test/dir");
  163.       assertTrue(fs.mkdirs(myPath));
  164.       assertTrue(fs.exists(myPath));
  165.       Path myFile = new Path("/test/dir/file");
  166.       writeFile(fs, myFile);
  167.       assertTrue(fs.exists(myFile));
  168.       Path myFile2 = new Path("/test/dir/file2");
  169.       writeFile(fs, myFile2);
  170.       assertTrue(fs.exists(myFile2));
  171.       
  172.       String[] args = new String[2];
  173.       args[0] = "-du";
  174.       args[1] = "/test/dir";
  175.       int val = -1;
  176.       try {
  177.         val = shell.run(args);
  178.       } catch (Exception e) {
  179.         System.err.println("Exception raised from DFSShell.run " +
  180.                             e.getLocalizedMessage());
  181.       }
  182.       assertTrue(val == 0);
  183.       String returnString = out.toString();
  184.       out.reset();
  185.       // Check if size matchs as expected
  186.       assertTrue(returnString.contains("22"));
  187.       assertTrue(returnString.contains("23"));
  188.       
  189.     } finally {
  190.       try {dfs.close();} catch (Exception e) {}
  191.       System.setOut(psBackup);
  192.       cluster.shutdown();
  193.     }
  194.                                   
  195.   }
  196.   public void testPut() throws IOException {
  197.     Configuration conf = new Configuration();
  198.     MiniDFSCluster cluster = new MiniDFSCluster(conf, 2, true, null);
  199.     FileSystem fs = cluster.getFileSystem();
  200.     assertTrue("Not a HDFS: "+fs.getUri(),
  201.                fs instanceof DistributedFileSystem);
  202.     final DistributedFileSystem dfs = (DistributedFileSystem)fs;
  203.     try {
  204.       // remove left over crc files:
  205.       new File(TEST_ROOT_DIR, ".f1.crc").delete();
  206.       new File(TEST_ROOT_DIR, ".f2.crc").delete();    
  207.       final File f1 = createLocalFile(new File(TEST_ROOT_DIR, "f1"));
  208.       final File f2 = createLocalFile(new File(TEST_ROOT_DIR, "f2"));
  209.   
  210.       final Path root = mkdir(dfs, new Path("/test/put"));
  211.       final Path dst = new Path(root, "dst");
  212.   
  213.       show("begin");
  214.       
  215.       final Thread copy2ndFileThread = new Thread() {
  216.         public void run() {
  217.           try {
  218.             show("copy local " + f2 + " to remote " + dst);
  219.             dfs.copyFromLocalFile(false, false, new Path(f2.getPath()), dst);
  220.           } catch (IOException ioe) {
  221.             show("good " + StringUtils.stringifyException(ioe));
  222.             return;
  223.           }
  224.           //should not be here, must got IOException
  225.           assertTrue(false);
  226.         }
  227.       };
  228.       
  229.       //use SecurityManager to pause the copying of f1 and begin copying f2
  230.       SecurityManager sm = System.getSecurityManager();
  231.       System.out.println("SecurityManager = " + sm);
  232.       System.setSecurityManager(new SecurityManager() {
  233.         private boolean firstTime = true;
  234.   
  235.         public void checkPermission(Permission perm) {
  236.           if (firstTime) {
  237.             Thread t = Thread.currentThread();
  238.             if (!t.toString().contains("DataNode")) {
  239.               String s = "" + Arrays.asList(t.getStackTrace());
  240.               if (s.contains("FileUtil.copyContent")) {
  241.                 //pause at FileUtil.copyContent
  242.   
  243.                 firstTime = false;
  244.                 copy2ndFileThread.start();
  245.                 try {Thread.sleep(5000);} catch (InterruptedException e) {}
  246.               }
  247.             }
  248.           }
  249.         }
  250.       });
  251.       show("copy local " + f1 + " to remote " + dst);
  252.       dfs.copyFromLocalFile(false, false, new Path(f1.getPath()), dst);
  253.       show("done");
  254.   
  255.       try {copy2ndFileThread.join();} catch (InterruptedException e) { }
  256.       System.setSecurityManager(sm);
  257.       // copy multiple files to destination directory
  258.       final Path destmultiple = mkdir(dfs, new Path("/test/putmultiple"));
  259.       Path[] srcs = new Path[2];
  260.       srcs[0] = new Path(f1.getPath());
  261.       srcs[1] = new Path(f2.getPath());
  262.       dfs.copyFromLocalFile(false, false, srcs, destmultiple);
  263.       srcs[0] = new Path(destmultiple,"f1"); 
  264.       srcs[1] = new Path(destmultiple,"f2"); 
  265.       assertTrue(dfs.exists(srcs[0]));
  266.       assertTrue(dfs.exists(srcs[1]));
  267.       // move multiple files to destination directory
  268.       final Path destmultiple2 = mkdir(dfs, new Path("/test/movemultiple"));
  269.       srcs[0] = new Path(f1.getPath());
  270.       srcs[1] = new Path(f2.getPath());
  271.       dfs.moveFromLocalFile(srcs, destmultiple2);
  272.       assertFalse(f1.exists());
  273.       assertFalse(f2.exists());
  274.       srcs[0] = new Path(destmultiple2, "f1");
  275.       srcs[1] = new Path(destmultiple2, "f2");
  276.       assertTrue(dfs.exists(srcs[0]));
  277.       assertTrue(dfs.exists(srcs[1]));
  278.       f1.delete();
  279.       f2.delete();
  280.     } finally {
  281.       try {dfs.close();} catch (Exception e) {}
  282.       cluster.shutdown();
  283.     }
  284.   }
  285.   /** check command error outputs and exit statuses. */
  286.   public void testErrOutPut() throws Exception {
  287.     Configuration conf = new Configuration();
  288.     MiniDFSCluster cluster = null;
  289.     PrintStream bak = null;
  290.     try {
  291.       cluster = new MiniDFSCluster(conf, 2, true, null);
  292.       FileSystem srcFs = cluster.getFileSystem();
  293.       Path root = new Path("/nonexistentfile");
  294.       bak = System.err;
  295.       ByteArrayOutputStream out = new ByteArrayOutputStream();
  296.       PrintStream tmp = new PrintStream(out);
  297.       System.setErr(tmp);
  298.       String[] argv = new String[2];
  299.       argv[0] = "-cat";
  300.       argv[1] = root.toUri().getPath();
  301.       int ret = ToolRunner.run(new FsShell(), argv);
  302.       assertTrue(" -cat returned -1 ", 0>=ret);
  303.       String returned = out.toString();
  304.       assertTrue("cat does not print exceptions ",
  305.           (returned.lastIndexOf("Exception") == -1));
  306.       out.reset();
  307.       argv[0] = "-rm";
  308.       argv[1] = root.toString();
  309.       FsShell shell = new FsShell();
  310.       shell.setConf(conf);
  311.       ret = ToolRunner.run(shell, argv);
  312.       assertTrue(" -rm returned -1 ", 0>=ret);
  313.       returned = out.toString();
  314.       out.reset();
  315.       assertTrue("rm prints reasonable error ",
  316.           (returned.lastIndexOf("No such file or directory") != -1));
  317.       argv[0] = "-rmr";
  318.       argv[1] = root.toString();
  319.       ret = ToolRunner.run(shell, argv);
  320.       assertTrue(" -rmr returned -1", 0>=ret);
  321.       returned = out.toString();
  322.       assertTrue("rmr prints reasonable error ",
  323.        (returned.lastIndexOf("No such file or directory") != -1));
  324.       out.reset();
  325.       argv[0] = "-du";
  326.       argv[1] = "/nonexistentfile";
  327.       ret = ToolRunner.run(shell, argv);
  328.       returned = out.toString();
  329.       assertTrue(" -du prints reasonable error ",
  330.           (returned.lastIndexOf("No such file or directory") != -1));
  331.       out.reset();
  332.       argv[0] = "-dus";
  333.       argv[1] = "/nonexistentfile";
  334.       ret = ToolRunner.run(shell, argv);
  335.       returned = out.toString();
  336.       assertTrue(" -dus prints reasonable error",
  337.           (returned.lastIndexOf("No such file or directory") != -1));
  338.       out.reset();
  339.       argv[0] = "-ls";
  340.       argv[1] = "/nonexistenfile";
  341.       ret = ToolRunner.run(shell, argv);
  342.       returned = out.toString();
  343.       assertTrue(" -ls does not return Found 0 items",
  344.           (returned.lastIndexOf("Found 0") == -1));
  345.       out.reset();
  346.       argv[0] = "-ls";
  347.       argv[1] = "/nonexistentfile";
  348.       ret = ToolRunner.run(shell, argv);
  349.       assertTrue(" -lsr should fail ",
  350.           (ret < 0));
  351.       out.reset();
  352.       srcFs.mkdirs(new Path("/testdir"));
  353.       argv[0] = "-ls";
  354.       argv[1] = "/testdir";
  355.       ret = ToolRunner.run(shell, argv);
  356.       returned = out.toString();
  357.       assertTrue(" -ls does not print out anything ",
  358.           (returned.lastIndexOf("Found 0") == -1));
  359.       out.reset();
  360.       argv[0] = "-ls";
  361.       argv[1] = "/user/nonxistant/*";
  362.       ret = ToolRunner.run(shell, argv);
  363.       assertTrue(" -ls on nonexistent glob returns -1",
  364.           (ret < 0));
  365.       out.reset();
  366.       argv[0] = "-mkdir";
  367.       argv[1] = "/testdir";
  368.       ret = ToolRunner.run(shell, argv);
  369.       returned = out.toString();
  370.       assertTrue(" -mkdir returned -1 ", (ret < 0));
  371.       assertTrue(" -mkdir returned File exists", 
  372.           (returned.lastIndexOf("File exists") != -1));
  373.       Path testFile = new Path("/testfile");
  374.       OutputStream outtmp = srcFs.create(testFile);
  375.       outtmp.write(testFile.toString().getBytes());
  376.       outtmp.close();
  377.       out.reset();
  378.       argv[0] = "-mkdir";
  379.       argv[1] = "/testfile";
  380.       ret = ToolRunner.run(shell, argv);
  381.       returned = out.toString();
  382.       assertTrue(" -mkdir returned -1", (ret < 0));
  383.       assertTrue(" -mkdir returned this is a file ",
  384.           (returned.lastIndexOf("not a directory") != -1));
  385.       out.reset();
  386.       argv = new String[3];
  387.       argv[0] = "-mv";
  388.       argv[1] = "/testfile";
  389.       argv[2] = "file";
  390.       ret = ToolRunner.run(shell, argv);
  391.       assertTrue("mv failed to rename", ret == -1);
  392.       out.reset();
  393.       argv = new String[3];
  394.       argv[0] = "-mv";
  395.       argv[1] = "/testfile";
  396.       argv[2] = "/testfiletest";
  397.       ret = ToolRunner.run(shell, argv);
  398.       returned = out.toString();
  399.       assertTrue("no output from rename", 
  400.           (returned.lastIndexOf("Renamed") == -1));
  401.       out.reset();
  402.       argv[0] = "-mv";
  403.       argv[1] = "/testfile";
  404.       argv[2] = "/testfiletmp";
  405.       ret = ToolRunner.run(shell, argv);
  406.       returned = out.toString();
  407.       assertTrue(" unix like output",
  408.           (returned.lastIndexOf("No such file or") != -1));
  409.       out.reset();
  410.       argv = new String[1];
  411.       argv[0] = "-du";
  412.       srcFs.mkdirs(srcFs.getHomeDirectory());
  413.       ret = ToolRunner.run(shell, argv);
  414.       returned = out.toString();
  415.       assertTrue(" no error ", (ret == 0));
  416.       assertTrue("empty path specified",
  417.           (returned.lastIndexOf("empty string") == -1));
  418.     } finally {
  419.       if (bak != null) {
  420.         System.setErr(bak);
  421.       }
  422.       if (cluster != null) {
  423.         cluster.shutdown();
  424.       }
  425.     }
  426.   }
  427.   
  428.   public void testURIPaths() throws Exception {
  429.     Configuration srcConf = new Configuration();
  430.     Configuration dstConf = new Configuration();
  431.     MiniDFSCluster srcCluster =  null;
  432.     MiniDFSCluster dstCluster = null;
  433.     String bak = System.getProperty("test.build.data");
  434.     try{
  435.       srcCluster = new MiniDFSCluster(srcConf, 2, true, null);
  436.       File nameDir = new File(new File(bak), "dfs_tmp_uri/");
  437.       nameDir.mkdirs();
  438.       System.setProperty("test.build.data", nameDir.toString());
  439.       dstCluster = new MiniDFSCluster(dstConf, 2, true, null);
  440.       FileSystem srcFs = srcCluster.getFileSystem();
  441.       FileSystem dstFs = dstCluster.getFileSystem();
  442.       FsShell shell = new FsShell();
  443.       shell.setConf(srcConf);
  444.       //check for ls
  445.       String[] argv = new String[2];
  446.       argv[0] = "-ls";
  447.       argv[1] = dstFs.getUri().toString() + "/";
  448.       int ret = ToolRunner.run(shell, argv);
  449.       assertTrue("ls works on remote uri ", (ret==0));
  450.       //check for rm -r 
  451.       dstFs.mkdirs(new Path("/hadoopdir"));
  452.       argv = new String[2];
  453.       argv[0] = "-rmr";
  454.       argv[1] = dstFs.getUri().toString() + "/hadoopdir";
  455.       ret = ToolRunner.run(shell, argv);
  456.       assertTrue("-rmr works on remote uri " + argv[1], (ret==0));
  457.       //check du 
  458.       argv[0] = "-du";
  459.       argv[1] = dstFs.getUri().toString() + "/";
  460.       ret = ToolRunner.run(shell, argv);
  461.       assertTrue("du works on remote uri ", (ret ==0));
  462.       //check put
  463.       File furi = new File(TEST_ROOT_DIR, "furi");
  464.       createLocalFile(furi);
  465.       argv = new String[3];
  466.       argv[0] = "-put";
  467.       argv[1] = furi.toString();
  468.       argv[2] = dstFs.getUri().toString() + "/furi";
  469.       ret = ToolRunner.run(shell, argv);
  470.       assertTrue(" put is working ", (ret==0));
  471.       //check cp 
  472.       argv[0] = "-cp";
  473.       argv[1] = dstFs.getUri().toString() + "/furi";
  474.       argv[2] = srcFs.getUri().toString() + "/furi";
  475.       ret = ToolRunner.run(shell, argv);
  476.       assertTrue(" cp is working ", (ret==0));
  477.       assertTrue(srcFs.exists(new Path("/furi")));
  478.       //check cat 
  479.       argv = new String[2];
  480.       argv[0] = "-cat";
  481.       argv[1] = dstFs.getUri().toString() + "/furi";
  482.       ret = ToolRunner.run(shell, argv);
  483.       assertTrue(" cat is working ", (ret == 0));
  484.       //check chown
  485.       dstFs.delete(new Path("/furi"), true);
  486.       dstFs.delete(new Path("/hadoopdir"), true);
  487.       String file = "/tmp/chownTest";
  488.       Path path = new Path(file);
  489.       Path parent = new Path("/tmp");
  490.       Path root = new Path("/");
  491.       TestDFSShell.writeFile(dstFs, path);
  492.       runCmd(shell, "-chgrp", "-R", "herbivores", dstFs.getUri().toString() +"/*");
  493.       confirmOwner(null, "herbivores", dstFs, parent, path);
  494.       runCmd(shell, "-chown", "-R", ":reptiles", dstFs.getUri().toString() + "/");
  495.       confirmOwner(null, "reptiles", dstFs, root, parent, path);
  496.       //check if default hdfs:/// works 
  497.       argv[0] = "-cat";
  498.       argv[1] = "hdfs:///furi";
  499.       ret = ToolRunner.run(shell, argv);
  500.       assertTrue(" default works for cat", (ret == 0));
  501.       argv[0] = "-ls";
  502.       argv[1] = "hdfs:///";
  503.       ret = ToolRunner.run(shell, argv);
  504.       assertTrue("default works for ls ", (ret == 0));
  505.       argv[0] = "-rmr";
  506.       argv[1] = "hdfs:///furi";
  507.       ret = ToolRunner.run(shell, argv);
  508.       assertTrue("default works for rm/rmr", (ret ==0));
  509.     } finally {
  510.       System.setProperty("test.build.data", bak);
  511.       if (null != srcCluster) {
  512.         srcCluster.shutdown();
  513.       }
  514.       if (null != dstCluster) {
  515.         dstCluster.shutdown();
  516.       }
  517.     }
  518.   }
  519.   public void testText() throws Exception {
  520.     Configuration conf = new Configuration();
  521.     MiniDFSCluster cluster = null;
  522.     PrintStream bak = null;
  523.     try {
  524.       cluster = new MiniDFSCluster(conf, 2, true, null);
  525.       FileSystem fs = cluster.getFileSystem();
  526.       Path root = new Path("/texttest");
  527.       fs.mkdirs(root);
  528.       OutputStream zout = new GZIPOutputStream(
  529.           fs.create(new Path(root, "file.gz")));
  530.       Random r = new Random();
  531.       ByteArrayOutputStream file = new ByteArrayOutputStream();
  532.       for (int i = 0; i < 1024; ++i) {
  533.         char c = Character.forDigit(r.nextInt(26) + 10, 36);
  534.         file.write(c);
  535.         zout.write(c);
  536.       }
  537.       zout.close();
  538.       bak = System.out;
  539.       ByteArrayOutputStream out = new ByteArrayOutputStream();
  540.       System.setOut(new PrintStream(out));
  541.       String[] argv = new String[2];
  542.       argv[0] = "-text";
  543.       argv[1] = new Path(root, "file.gz").toUri().getPath();
  544.       int ret = ToolRunner.run(new FsShell(), argv);
  545.       assertTrue("-text returned -1", 0 >= ret);
  546.       file.reset();
  547.       out.reset();
  548.       assertTrue("Output doesn't match input",
  549.           Arrays.equals(file.toByteArray(), out.toByteArray()));
  550.     } finally {
  551.       if (null != bak) {
  552.         System.setOut(bak);
  553.       }
  554.       if (null != cluster) {
  555.         cluster.shutdown();
  556.       }
  557.     }
  558.   }
  559.   public void testCopyToLocal() throws IOException {
  560.     Configuration conf = new Configuration();
  561.     /* This tests some properties of ChecksumFileSystem as well.
  562.      * Make sure that we create ChecksumDFS */
  563.     conf.set("fs.hdfs.impl",
  564.              "org.apache.hadoop.hdfs.ChecksumDistributedFileSystem");
  565.     MiniDFSCluster cluster = new MiniDFSCluster(conf, 2, true, null);
  566.     FileSystem fs = cluster.getFileSystem();
  567.     assertTrue("Not a HDFS: "+fs.getUri(),
  568.                fs instanceof ChecksumDistributedFileSystem);
  569.     ChecksumDistributedFileSystem dfs = (ChecksumDistributedFileSystem)fs;
  570.     FsShell shell = new FsShell();
  571.     shell.setConf(conf);
  572.     try {
  573.       String root = createTree(dfs, "copyToLocal");
  574.       // Verify copying the tree
  575.       {
  576.         try {
  577.           assertEquals(0,
  578.               runCmd(shell, "-copyToLocal", root + "*", TEST_ROOT_DIR));
  579.         } catch (Exception e) {
  580.           System.err.println("Exception raised from DFSShell.run " +
  581.                              e.getLocalizedMessage());
  582.         }
  583.         File localroot = new File(TEST_ROOT_DIR, "copyToLocal");
  584.         File localroot2 = new File(TEST_ROOT_DIR, "copyToLocal2");        
  585.         
  586.         File f1 = new File(localroot, "f1");
  587.         assertTrue("Copying failed.", f1.isFile());
  588.         File f2 = new File(localroot, "f2");
  589.         assertTrue("Copying failed.", f2.isFile());
  590.         File sub = new File(localroot, "sub");
  591.         assertTrue("Copying failed.", sub.isDirectory());
  592.         File f3 = new File(sub, "f3");
  593.         assertTrue("Copying failed.", f3.isFile());
  594.         File f4 = new File(sub, "f4");
  595.         assertTrue("Copying failed.", f4.isFile());
  596.         
  597.         File f5 = new File(localroot2, "f1");
  598.         assertTrue("Copying failed.", f5.isFile());        
  599.         f1.delete();
  600.         f2.delete();
  601.         f3.delete();
  602.         f4.delete();
  603.         f5.delete();
  604.         sub.delete();
  605.       }
  606.       // Verify copying non existing sources do not create zero byte
  607.       // destination files
  608.       {
  609.         String[] args = {"-copyToLocal", "nosuchfile", TEST_ROOT_DIR};
  610.         try {   
  611.           assertEquals(-1, shell.run(args));
  612.         } catch (Exception e) {
  613.           System.err.println("Exception raised from DFSShell.run " +
  614.                             e.getLocalizedMessage());
  615.         }                            
  616.         File f6 = new File(TEST_ROOT_DIR, "nosuchfile");
  617.         assertTrue(!f6.exists());
  618.       }
  619.     } finally {
  620.       try {
  621.         dfs.close();
  622.       } catch (Exception e) {
  623.       }
  624.       cluster.shutdown();
  625.     }
  626.   }
  627.   static String createTree(FileSystem fs, String name) throws IOException {
  628.     // create a tree
  629.     //   ROOT
  630.     //   |- f1
  631.     //   |- f2
  632.     //   + sub
  633.     //      |- f3
  634.     //      |- f4
  635.     //   ROOT2
  636.     //   |- f1
  637.     String path = "/test/" + name;
  638.     Path root = mkdir(fs, new Path(path));
  639.     Path sub = mkdir(fs, new Path(root, "sub"));
  640.     Path root2 = mkdir(fs, new Path(path + "2"));        
  641.     writeFile(fs, new Path(root, "f1"));
  642.     writeFile(fs, new Path(root, "f2"));
  643.     writeFile(fs, new Path(sub, "f3"));
  644.     writeFile(fs, new Path(sub, "f4"));
  645.     writeFile(fs, new Path(root2, "f1"));
  646.     mkdir(fs, new Path(root2, "sub"));
  647.     return path;
  648.   }
  649.   public void testCount() throws Exception {
  650.     Configuration conf = new Configuration();
  651.     MiniDFSCluster cluster = new MiniDFSCluster(conf, 2, true, null);
  652.     DistributedFileSystem dfs = (DistributedFileSystem)cluster.getFileSystem();
  653.     FsShell shell = new FsShell();
  654.     shell.setConf(conf);
  655.     try {
  656.       String root = createTree(dfs, "count");
  657.       // Verify the counts
  658.       runCount(root, 2, 4, conf);
  659.       runCount(root + "2", 2, 1, conf);
  660.       runCount(root + "2/f1", 0, 1, conf);
  661.       runCount(root + "2/sub", 1, 0, conf);
  662.       final FileSystem localfs = FileSystem.getLocal(conf);
  663.       Path localpath = new Path(TEST_ROOT_DIR, "testcount");
  664.       localpath = localpath.makeQualified(localfs);
  665.       localfs.mkdirs(localpath);
  666.       
  667.       final String localstr = localpath.toString();
  668.       System.out.println("localstr=" + localstr);
  669.       runCount(localstr, 1, 0, conf);
  670.       assertEquals(0, new Count(new String[]{root, localstr}, 0, conf).runAll());
  671.     } finally {
  672.       try {
  673.         dfs.close();
  674.       } catch (Exception e) {
  675.       }
  676.       cluster.shutdown();
  677.     }
  678.   }
  679.   private void runCount(String path, long dirs, long files, Configuration conf
  680.     ) throws IOException {
  681.     ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
  682.     PrintStream out = new PrintStream(bytes);
  683.     PrintStream oldOut = System.out;
  684.     System.setOut(out);
  685.     Scanner in = null;
  686.     String results = null;
  687.     try {
  688.       new Count(new String[]{path}, 0, conf).runAll();
  689.       results = bytes.toString();
  690.       in = new Scanner(results);
  691.       assertEquals(dirs, in.nextLong());
  692.       assertEquals(files, in.nextLong());
  693.     } finally {
  694.       if (in!=null) in.close();
  695.       IOUtils.closeStream(out);
  696.       System.setOut(oldOut);
  697.       System.out.println("results:n" + results);
  698.     }
  699.   }
  700.   //throws IOException instead of Exception as shell.run() does.
  701.   private int runCmd(FsShell shell, String... args) throws IOException {
  702.     try {
  703.       return shell.run(args);
  704.     } catch (IOException e) {
  705.       throw e;
  706.     } catch (RuntimeException e) {
  707.       throw e;
  708.     } catch (Exception e) {
  709.       throw new IOException(StringUtils.stringifyException(e));
  710.     }
  711.   }
  712.   
  713.   /**
  714.    * Test chmod.
  715.    */
  716.   void testChmod(Configuration conf, FileSystem fs, String chmodDir) 
  717.                                                     throws IOException {
  718.     FsShell shell = new FsShell();
  719.     shell.setConf(conf);
  720.     
  721.     try {
  722.      //first make dir
  723.      Path dir = new Path(chmodDir);
  724.      fs.delete(dir, true);
  725.      fs.mkdirs(dir);
  726.      runCmd(shell, "-chmod", "u+rwx,g=rw,o-rwx", chmodDir);
  727.      assertEquals("rwxrw----",
  728.                   fs.getFileStatus(dir).getPermission().toString());
  729.      //create an empty file
  730.      Path file = new Path(chmodDir, "file");
  731.      TestDFSShell.writeFile(fs, file);
  732.      //test octal mode
  733.      runCmd(shell, "-chmod", "644", file.toString());
  734.      assertEquals("rw-r--r--",
  735.                   fs.getFileStatus(file).getPermission().toString());
  736.      //test recursive
  737.      runCmd(shell, "-chmod", "-R", "a+rwX", chmodDir);
  738.      assertEquals("rwxrwxrwx",
  739.                   fs.getFileStatus(dir).getPermission().toString()); 
  740.      assertEquals("rw-rw-rw-",
  741.                   fs.getFileStatus(file).getPermission().toString());
  742.      
  743.      fs.delete(dir, true);     
  744.     } finally {
  745.       try {
  746.         fs.close();
  747.         shell.close();
  748.       } catch (IOException ignored) {}
  749.     }
  750.   }
  751.   
  752.   private void confirmOwner(String owner, String group, 
  753.                             FileSystem fs, Path... paths) throws IOException {
  754.     for(Path path : paths) {
  755.       if (owner != null) {
  756.         assertEquals(owner, fs.getFileStatus(path).getOwner());
  757.       }
  758.       if (group != null) {
  759.         assertEquals(group, fs.getFileStatus(path).getGroup());
  760.       }
  761.     }
  762.   }
  763.   
  764.   public void testFilePermissions() throws IOException {
  765.     Configuration conf = new Configuration();
  766.     
  767.     //test chmod on local fs
  768.     FileSystem fs = FileSystem.getLocal(conf);
  769.     testChmod(conf, fs, 
  770.               (new File(TEST_ROOT_DIR, "chmodTest")).getAbsolutePath());
  771.     
  772.     conf.set("dfs.permissions", "true");
  773.     
  774.     //test chmod on DFS
  775.     MiniDFSCluster cluster = new MiniDFSCluster(conf, 2, true, null);
  776.     fs = cluster.getFileSystem();
  777.     testChmod(conf, fs, "/tmp/chmodTest");
  778.     
  779.     // test chown and chgrp on DFS:
  780.     
  781.     FsShell shell = new FsShell();
  782.     shell.setConf(conf);
  783.     fs = cluster.getFileSystem();
  784.     
  785.     /* For dfs, I am the super user and I can change ower of any file to
  786.      * anything. "-R" option is already tested by chmod test above.
  787.      */
  788.     
  789.     String file = "/tmp/chownTest";
  790.     Path path = new Path(file);
  791.     Path parent = new Path("/tmp");
  792.     Path root = new Path("/");
  793.     TestDFSShell.writeFile(fs, path);
  794.     
  795.     runCmd(shell, "-chgrp", "-R", "herbivores", "/*", "unknownFile*");
  796.     confirmOwner(null, "herbivores", fs, parent, path);
  797.     
  798.     runCmd(shell, "-chgrp", "mammals", file);
  799.     confirmOwner(null, "mammals", fs, path);
  800.     
  801.     runCmd(shell, "-chown", "-R", ":reptiles", "/");
  802.     confirmOwner(null, "reptiles", fs, root, parent, path);
  803.     
  804.     runCmd(shell, "-chown", "python:", "/nonExistentFile", file);
  805.     confirmOwner("python", "reptiles", fs, path);
  806.     runCmd(shell, "-chown", "-R", "hadoop:toys", "unknownFile", "/");
  807.     confirmOwner("hadoop", "toys", fs, root, parent, path);
  808.     
  809.     // Test different characters in names
  810.     runCmd(shell, "-chown", "hdfs.user", file);
  811.     confirmOwner("hdfs.user", null, fs, path);
  812.     
  813.     runCmd(shell, "-chown", "_Hdfs.User-10:_hadoop.users--", file);
  814.     confirmOwner("_Hdfs.User-10", "_hadoop.users--", fs, path);
  815.     
  816.     runCmd(shell, "-chown", "hdfs/hadoop-core@apache.org:asf-projects", file);
  817.     confirmOwner("hdfs/hadoop-core@apache.org", "asf-projects", fs, path);
  818.     
  819.     runCmd(shell, "-chgrp", "hadoop-core@apache.org/100", file);
  820.     confirmOwner(null, "hadoop-core@apache.org/100", fs, path);
  821.     
  822.     cluster.shutdown();
  823.   }
  824.   /**
  825.    * Tests various options of DFSShell.
  826.    */
  827.   public void testDFSShell() throws IOException {
  828.     Configuration conf = new Configuration();
  829.     /* This tests some properties of ChecksumFileSystem as well.
  830.      * Make sure that we create ChecksumDFS */
  831.     conf.set("fs.hdfs.impl",
  832.              "org.apache.hadoop.hdfs.ChecksumDistributedFileSystem");
  833.     MiniDFSCluster cluster = new MiniDFSCluster(conf, 2, true, null);
  834.     FileSystem fs = cluster.getFileSystem();
  835.     assertTrue("Not a HDFS: "+fs.getUri(),
  836.             fs instanceof ChecksumDistributedFileSystem);
  837.     ChecksumDistributedFileSystem fileSys = (ChecksumDistributedFileSystem)fs;
  838.     FsShell shell = new FsShell();
  839.     shell.setConf(conf);
  840.     try {
  841.       // First create a new directory with mkdirs
  842.       Path myPath = new Path("/test/mkdirs");
  843.       assertTrue(fileSys.mkdirs(myPath));
  844.       assertTrue(fileSys.exists(myPath));
  845.       assertTrue(fileSys.mkdirs(myPath));
  846.       // Second, create a file in that directory.
  847.       Path myFile = new Path("/test/mkdirs/myFile");
  848.       writeFile(fileSys, myFile);
  849.       assertTrue(fileSys.exists(myFile));
  850.       Path myFile2 = new Path("/test/mkdirs/myFile2");      
  851.       writeFile(fileSys, myFile2);
  852.       assertTrue(fileSys.exists(myFile2));
  853.       // Verify that rm with a pattern
  854.       {
  855.         String[] args = new String[2];
  856.         args[0] = "-rm";
  857.         args[1] = "/test/mkdirs/myFile*";
  858.         int val = -1;
  859.         try {
  860.           val = shell.run(args);
  861.         } catch (Exception e) {
  862.           System.err.println("Exception raised from DFSShell.run " +
  863.                              e.getLocalizedMessage()); 
  864.         }
  865.         assertTrue(val == 0);
  866.         assertFalse(fileSys.exists(myFile));
  867.         assertFalse(fileSys.exists(myFile2));
  868.         //re-create the files for other tests
  869.         writeFile(fileSys, myFile);
  870.         assertTrue(fileSys.exists(myFile));
  871.         writeFile(fileSys, myFile2);
  872.         assertTrue(fileSys.exists(myFile2));
  873.       }
  874.       // Verify that we can read the file
  875.       {
  876.         String[] args = new String[3];
  877.         args[0] = "-cat";
  878.         args[1] = "/test/mkdirs/myFile";
  879.         args[2] = "/test/mkdirs/myFile2";        
  880.         int val = -1;
  881.         try {
  882.           val = shell.run(args);
  883.         } catch (Exception e) {
  884.           System.err.println("Exception raised from DFSShell.run: " +
  885.                              StringUtils.stringifyException(e)); 
  886.         }
  887.         assertTrue(val == 0);
  888.       }
  889.       fileSys.delete(myFile2, true);
  890.       // Verify that we can get with and without crc
  891.       {
  892.         File testFile = new File(TEST_ROOT_DIR, "mkdirs/myFile");
  893.         File checksumFile = new File(fileSys.getChecksumFile(
  894.                                                              new Path(testFile.getAbsolutePath())).toString());
  895.         testFile.delete();
  896.         checksumFile.delete();
  897.           
  898.         String[] args = new String[3];
  899.         args[0] = "-get";
  900.         args[1] = "/test/mkdirs";
  901.         args[2] = TEST_ROOT_DIR;
  902.         int val = -1;
  903.         try {
  904.           val = shell.run(args);
  905.         } catch (Exception e) {
  906.           System.err.println("Exception raised from DFSShell.run " +
  907.                              e.getLocalizedMessage()); 
  908.         }
  909.         assertTrue(val == 0);
  910.         assertTrue("Copying failed.", testFile.exists());
  911.         assertTrue("Checksum file " + checksumFile+" is copied.", !checksumFile.exists());
  912.         testFile.delete();
  913.       }
  914.       {
  915.         File testFile = new File(TEST_ROOT_DIR, "mkdirs/myFile");
  916.         File checksumFile = new File(fileSys.getChecksumFile(
  917.                                                              new Path(testFile.getAbsolutePath())).toString());
  918.         testFile.delete();
  919.         checksumFile.delete();
  920.           
  921.         String[] args = new String[4];
  922.         args[0] = "-get";
  923.         args[1] = "-crc";
  924.         args[2] = "/test/mkdirs";
  925.         args[3] = TEST_ROOT_DIR;
  926.         int val = -1;
  927.         try {
  928.           val = shell.run(args);
  929.         } catch (Exception e) {
  930.           System.err.println("Exception raised from DFSShell.run " +
  931.                              e.getLocalizedMessage()); 
  932.         }
  933.         assertTrue(val == 0);
  934.           
  935.         assertTrue("Copying data file failed.", testFile.exists());
  936.         assertTrue("Checksum file " + checksumFile+" not copied.", checksumFile.exists());
  937.         testFile.delete();
  938.         checksumFile.delete();
  939.       }
  940.       // Verify that we get an error while trying to read an nonexistent file
  941.       {
  942.         String[] args = new String[2];
  943.         args[0] = "-cat";
  944.         args[1] = "/test/mkdirs/myFile1";
  945.         int val = -1;
  946.         try {
  947.           val = shell.run(args);
  948.         } catch (Exception e) {
  949.           System.err.println("Exception raised from DFSShell.run " +
  950.                              e.getLocalizedMessage()); 
  951.         }
  952.         assertTrue(val != 0);
  953.       }
  954.       // Verify that we get an error while trying to delete an nonexistent file
  955.       {
  956.         String[] args = new String[2];
  957.         args[0] = "-rm";
  958.         args[1] = "/test/mkdirs/myFile1";
  959.         int val = -1;
  960.         try {
  961.           val = shell.run(args);
  962.         } catch (Exception e) {
  963.           System.err.println("Exception raised from DFSShell.run " +
  964.                              e.getLocalizedMessage()); 
  965.         }
  966.         assertTrue(val != 0);
  967.       }
  968.       // Verify that we succeed in removing the file we created
  969.       {
  970.         String[] args = new String[2];
  971.         args[0] = "-rm";
  972.         args[1] = "/test/mkdirs/myFile";
  973.         int val = -1;
  974.         try {
  975.           val = shell.run(args);
  976.         } catch (Exception e) {
  977.           System.err.println("Exception raised from DFSShell.run " +
  978.                              e.getLocalizedMessage()); 
  979.         }
  980.         assertTrue(val == 0);
  981.       }
  982.       // Verify touch/test
  983.       {
  984.         String[] args = new String[2];
  985.         args[0] = "-touchz";
  986.         args[1] = "/test/mkdirs/noFileHere";
  987.         int val = -1;
  988.         try {
  989.           val = shell.run(args);
  990.         } catch (Exception e) {
  991.           System.err.println("Exception raised from DFSShell.run " +
  992.                              e.getLocalizedMessage());
  993.         }
  994.         assertTrue(val == 0);
  995.         args = new String[3];
  996.         args[0] = "-test";
  997.         args[1] = "-e";
  998.         args[2] = "/test/mkdirs/noFileHere";
  999.         val = -1;
  1000.         try {
  1001.           val = shell.run(args);
  1002.         } catch (Exception e) {
  1003.           System.err.println("Exception raised from DFSShell.run " +
  1004.                              e.getLocalizedMessage());
  1005.         }
  1006.         assertTrue(val == 0);
  1007.       }
  1008.       // Verify that cp from a directory to a subdirectory fails
  1009.       {
  1010.         String[] args = new String[2];
  1011.         args[0] = "-mkdir";
  1012.         args[1] = "/test/dir1";
  1013.         int val = -1;
  1014.         try {
  1015.           val = shell.run(args);
  1016.         } catch (Exception e) {
  1017.           System.err.println("Exception raised from DFSShell.run " +
  1018.                              e.getLocalizedMessage());
  1019.         }
  1020.         assertTrue(val == 0);
  1021.         // this should fail
  1022.         String[] args1 = new String[3];
  1023.         args1[0] = "-cp";
  1024.         args1[1] = "/test/dir1";
  1025.         args1[2] = "/test/dir1/dir2";
  1026.         val = 0;
  1027.         try {
  1028.           val = shell.run(args1);
  1029.         } catch (Exception e) {
  1030.           System.err.println("Exception raised from DFSShell.run " +
  1031.                              e.getLocalizedMessage());
  1032.         }
  1033.         assertTrue(val == -1);
  1034.         // this should succeed
  1035.         args1[0] = "-cp";
  1036.         args1[1] = "/test/dir1";
  1037.         args1[2] = "/test/dir1foo";
  1038.         val = -1;
  1039.         try {
  1040.           val = shell.run(args1);
  1041.         } catch (Exception e) {
  1042.           System.err.println("Exception raised from DFSShell.run " +
  1043.                              e.getLocalizedMessage());
  1044.         }
  1045.         assertTrue(val == 0);
  1046.       }
  1047.         
  1048.     } finally {
  1049.       try {
  1050.         fileSys.close();
  1051.       } catch (Exception e) {
  1052.       }
  1053.       cluster.shutdown();
  1054.     }
  1055.   }
  1056.   static List<File> getBlockFiles(MiniDFSCluster cluster) throws IOException {
  1057.     List<File> files = new ArrayList<File>();
  1058.     List<DataNode> datanodes = cluster.getDataNodes();
  1059.     Block[][] blocks = cluster.getAllBlockReports();
  1060.     for(int i = 0; i < blocks.length; i++) {
  1061.       FSDataset ds = (FSDataset)datanodes.get(i).getFSDataset();
  1062.       for(Block b : blocks[i]) {
  1063.         files.add(ds.getBlockFile(b));
  1064.       }        
  1065.     }
  1066.     return files;
  1067.   }
  1068.   static void corrupt(List<File> files) throws IOException {
  1069.     for(File f : files) {
  1070.       StringBuilder content = new StringBuilder(DFSTestUtil.readFile(f));
  1071.       char c = content.charAt(0);
  1072.       content.setCharAt(0, ++c);
  1073.       PrintWriter out = new PrintWriter(f);
  1074.       out.print(content);
  1075.       out.flush();
  1076.       out.close();      
  1077.     }
  1078.   }
  1079.   static interface TestGetRunner {
  1080.     String run(int exitcode, String... options) throws IOException;
  1081.   }
  1082.   public void testRemoteException() throws Exception {
  1083.     UnixUserGroupInformation tmpUGI = new UnixUserGroupInformation("tmpname",
  1084.         new String[] {
  1085.         "mygroup"});
  1086.     MiniDFSCluster dfs = null;
  1087.     PrintStream bak = null;
  1088.     try {
  1089.       Configuration conf = new Configuration();
  1090.       dfs = new MiniDFSCluster(conf, 2, true, null);
  1091.       FileSystem fs = dfs.getFileSystem();
  1092.       Path p = new Path("/foo");
  1093.       fs.mkdirs(p);
  1094.       fs.setPermission(p, new FsPermission((short)0700));
  1095.       UnixUserGroupInformation.saveToConf(conf,
  1096.           UnixUserGroupInformation.UGI_PROPERTY_NAME, tmpUGI);
  1097.       FsShell fshell = new FsShell(conf);
  1098.       bak = System.err;
  1099.       ByteArrayOutputStream out = new ByteArrayOutputStream();
  1100.       PrintStream tmp = new PrintStream(out);
  1101.       System.setErr(tmp);
  1102.       String[] args = new String[2];
  1103.       args[0] = "-ls";
  1104.       args[1] = "/foo";
  1105.       int ret = ToolRunner.run(fshell, args);
  1106.       assertTrue("returned should be -1", (ret == -1));
  1107.       String str = out.toString();
  1108.       assertTrue("permission denied printed", str.indexOf("Permission denied") != -1);
  1109.       out.reset();
  1110.     } finally {
  1111.       if (bak != null) {
  1112.         System.setErr(bak);
  1113.       }
  1114.       if (dfs != null) {
  1115.         dfs.shutdown();
  1116.       }
  1117.     }
  1118.   }
  1119.   
  1120.   public void testGet() throws IOException {
  1121.     DFSTestUtil.setLogLevel2All(FSInputChecker.LOG);
  1122.     final Configuration conf = new Configuration();
  1123.     MiniDFSCluster cluster = new MiniDFSCluster(conf, 2, true, null);
  1124.     DistributedFileSystem dfs = (DistributedFileSystem)cluster.getFileSystem();
  1125.     try {
  1126.       final String fname = "testGet.txt";
  1127.       final File localf = createLocalFile(new File(TEST_ROOT_DIR, fname));
  1128.       final String localfcontent = DFSTestUtil.readFile(localf);
  1129.       final Path root = mkdir(dfs, new Path("/test/get"));
  1130.       final Path remotef = new Path(root, fname);
  1131.       dfs.copyFromLocalFile(false, false, new Path(localf.getPath()), remotef);
  1132.       final FsShell shell = new FsShell();
  1133.       shell.setConf(conf);
  1134.       TestGetRunner runner = new TestGetRunner() {
  1135.         private int count = 0;
  1136.         public String run(int exitcode, String... options) throws IOException {
  1137.           String dst = TEST_ROOT_DIR + "/" + fname+ ++count;
  1138.           String[] args = new String[options.length + 3];
  1139.           args[0] = "-get"; 
  1140.           args[args.length - 2] = remotef.toString();
  1141.           args[args.length - 1] = dst;
  1142.           for(int i = 0; i < options.length; i++) {
  1143.             args[i + 1] = options[i];
  1144.           }
  1145.           show("args=" + Arrays.asList(args));
  1146.           
  1147.           try {
  1148.             assertEquals(exitcode, shell.run(args));
  1149.           } catch (Exception e) {
  1150.             assertTrue(StringUtils.stringifyException(e), false); 
  1151.           }
  1152.           return exitcode == 0? DFSTestUtil.readFile(new File(dst)): null; 
  1153.         }
  1154.       };
  1155.       assertEquals(localfcontent, runner.run(0));
  1156.       assertEquals(localfcontent, runner.run(0, "-ignoreCrc"));
  1157.       //find and modify the block files
  1158.       List<File> files = getBlockFiles(cluster);
  1159.       show("files=" + files);
  1160.       corrupt(files);
  1161.       assertEquals(null, runner.run(-1));
  1162.       String corruptedcontent = runner.run(0, "-ignoreCrc");
  1163.       assertEquals(localfcontent.substring(1), corruptedcontent.substring(1));
  1164.       assertEquals(localfcontent.charAt(0)+1, corruptedcontent.charAt(0));
  1165.       localf.delete();
  1166.     } finally {
  1167.       try {dfs.close();} catch (Exception e) {}
  1168.       cluster.shutdown();
  1169.     }
  1170.   }
  1171.   public void testLsr() throws Exception {
  1172.     Configuration conf = new Configuration();
  1173.     MiniDFSCluster cluster = new MiniDFSCluster(conf, 2, true, null);
  1174.     DistributedFileSystem dfs = (DistributedFileSystem)cluster.getFileSystem();
  1175.     try {
  1176.       final String root = createTree(dfs, "lsr");
  1177.       dfs.mkdirs(new Path(root, "zzz"));
  1178.       
  1179.       runLsr(new FsShell(conf), root, 0);
  1180.       
  1181.       final Path sub = new Path(root, "sub");
  1182.       dfs.setPermission(sub, new FsPermission((short)0));
  1183.       final UserGroupInformation ugi = UserGroupInformation.getCurrentUGI();
  1184.       final String tmpusername = ugi.getUserName() + "1";
  1185.       UnixUserGroupInformation tmpUGI = new UnixUserGroupInformation(
  1186.           tmpusername, new String[] {tmpusername});
  1187.       UnixUserGroupInformation.saveToConf(conf,
  1188.             UnixUserGroupInformation.UGI_PROPERTY_NAME, tmpUGI);
  1189.       String results = runLsr(new FsShell(conf), root, -1);
  1190.       assertTrue(results.contains("zzz"));
  1191.     } finally {
  1192.       cluster.shutdown();
  1193.     }
  1194.   }
  1195.   private static String runLsr(final FsShell shell, String root, int returnvalue
  1196.       ) throws Exception {
  1197.     System.out.println("root=" + root + ", returnvalue=" + returnvalue);
  1198.     final ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
  1199.     final PrintStream out = new PrintStream(bytes);
  1200.     final PrintStream oldOut = System.out;
  1201.     final PrintStream oldErr = System.err;
  1202.     System.setOut(out);
  1203.     System.setErr(out);
  1204.     final String results;
  1205.     try {
  1206.       assertEquals(returnvalue, shell.run(new String[]{"-lsr", root}));
  1207.       results = bytes.toString();
  1208.     } finally {
  1209.       IOUtils.closeStream(out);
  1210.       System.setOut(oldOut);
  1211.       System.setErr(oldErr);
  1212.     }
  1213.     System.out.println("results:n" + results);
  1214.     return results;
  1215.   }
  1216. }