TestGlobPaths.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.IOException;
  20. import java.util.regex.Pattern;
  21. import org.apache.hadoop.conf.Configuration;
  22. import org.apache.hadoop.hdfs.MiniDFSCluster;
  23. import junit.framework.TestCase;
  24. public class TestGlobPaths extends TestCase {
  25.   
  26.   static class RegexPathFilter implements PathFilter {
  27.     
  28.     private final String regex;
  29.     public RegexPathFilter(String regex) {
  30.       this.regex = regex;
  31.     }
  32.     public boolean accept(Path path) {
  33.       return path.toString().matches(regex);
  34.     }
  35.   }
  36.   
  37.   static private MiniDFSCluster dfsCluster;
  38.   static private FileSystem fs;
  39.   static final private int NUM_OF_PATHS = 4;
  40.   static final String USER_DIR = "/user/"+System.getProperty("user.name");
  41.   private Path[] path = new Path[NUM_OF_PATHS];
  42.   
  43.   protected void setUp() throws Exception {
  44.     try {
  45.       Configuration conf = new Configuration();
  46.       dfsCluster = new MiniDFSCluster(conf, 1, true, null);
  47.       fs = FileSystem.get(conf);
  48.     } catch (IOException e) {
  49.       e.printStackTrace();
  50.     }
  51.   }
  52.   
  53.   protected void tearDown() throws Exception {
  54.     if(dfsCluster!=null) {
  55.       dfsCluster.shutdown();
  56.     }
  57.   }
  58.   
  59.   public void testPathFilter() throws IOException {
  60.     try {
  61.       String[] files = new String[] { USER_DIR + "/a", USER_DIR + "/a/b" };
  62.       Path[] matchedPath = prepareTesting(USER_DIR + "/*/*", files,
  63.           new RegexPathFilter("^.*" + Pattern.quote(USER_DIR) + "/a/b"));
  64.       assertEquals(matchedPath.length, 1);
  65.       assertEquals(matchedPath[0], path[1]);
  66.     } finally {
  67.       cleanupDFS();
  68.     }
  69.   }
  70.   
  71.   public void testPathFilterWithFixedLastComponent() throws IOException {
  72.     try {
  73.       String[] files = new String[] { USER_DIR + "/a", USER_DIR + "/a/b",
  74.                                       USER_DIR + "/c", USER_DIR + "/c/b", };
  75.       Path[] matchedPath = prepareTesting(USER_DIR + "/*/b", files,
  76.           new RegexPathFilter("^.*" + Pattern.quote(USER_DIR) + "/a/b"));
  77.       assertEquals(matchedPath.length, 1);
  78.       assertEquals(matchedPath[0], path[1]);
  79.     } finally {
  80.       cleanupDFS();
  81.     }
  82.   }
  83.   
  84.   public void testGlob() throws Exception {
  85.     //pTestEscape(); // need to wait until HADOOP-1995 is fixed
  86.     pTestJavaRegexSpecialChars();
  87.     pTestCurlyBracket();
  88.     pTestLiteral();
  89.     pTestAny();
  90.     pTestClosure();
  91.     pTestSet();
  92.     pTestRange();
  93.     pTestSetExcl();
  94.     pTestCombination();
  95.     pTestRelativePath();
  96.   }
  97.   
  98.   private void pTestLiteral() throws IOException {
  99.     try {
  100.       String [] files = new String[] {USER_DIR+"/a2c", USER_DIR+"/abc.d"};
  101.       Path[] matchedPath = prepareTesting(USER_DIR+"/abc.d", files);
  102.       assertEquals(matchedPath.length, 1);
  103.       assertEquals(matchedPath[0], path[1]);
  104.     } finally {
  105.       cleanupDFS();
  106.     }
  107.   }
  108.   
  109.   private void pTestEscape() throws IOException {
  110.     try {
  111.       String [] files = new String[] {USER_DIR+"/ab\[c.d"};
  112.       Path[] matchedPath = prepareTesting(USER_DIR+"/ab\[c.d", files);
  113.       assertEquals(matchedPath.length, 1);
  114.       assertEquals(matchedPath[0], path[0]);
  115.     } finally {
  116.       cleanupDFS();
  117.     }
  118.   }
  119.   
  120.   private void pTestAny() throws IOException {
  121.     try {
  122.       String [] files = new String[] { USER_DIR+"/abc", USER_DIR+"/a2c",
  123.                                        USER_DIR+"/a.c", USER_DIR+"/abcd"};
  124.       Path[] matchedPath = prepareTesting(USER_DIR+"/a?c", files);
  125.       assertEquals(matchedPath.length, 3);
  126.       assertEquals(matchedPath[0], path[2]);
  127.       assertEquals(matchedPath[1], path[1]);
  128.       assertEquals(matchedPath[2], path[0]);
  129.     } finally {
  130.       cleanupDFS();
  131.     }
  132.   }
  133.   
  134.   private void pTestClosure() throws IOException {
  135.     pTestClosure1();
  136.     pTestClosure2();
  137.     pTestClosure3();
  138.     pTestClosure4();
  139.     pTestClosure5();
  140.   }
  141.   
  142.   private void pTestClosure1() throws IOException {
  143.     try {
  144.       String [] files = new String[] {USER_DIR+"/a", USER_DIR+"/abc",
  145.                                       USER_DIR+"/abc.p", USER_DIR+"/bacd"};
  146.       Path[] matchedPath = prepareTesting(USER_DIR+"/a*", files);
  147.       assertEquals(matchedPath.length, 3);
  148.       assertEquals(matchedPath[0], path[0]);
  149.       assertEquals(matchedPath[1], path[1]);
  150.       assertEquals(matchedPath[2], path[2]);
  151.     } finally {
  152.       cleanupDFS();
  153.     }
  154.   }
  155.   
  156.   private void pTestClosure2() throws IOException {
  157.     try {
  158.       String [] files = new String[] {USER_DIR+"/a.", USER_DIR+"/a.txt",
  159.                                      USER_DIR+"/a.old.java", USER_DIR+"/.java"};
  160.       Path[] matchedPath = prepareTesting(USER_DIR+"/a.*", files);
  161.       assertEquals(matchedPath.length, 3);
  162.       assertEquals(matchedPath[0], path[0]);
  163.       assertEquals(matchedPath[1], path[2]);
  164.       assertEquals(matchedPath[2], path[1]);
  165.     } finally {
  166.       cleanupDFS();
  167.     }
  168.   }
  169.   
  170.   private void pTestClosure3() throws IOException {
  171.     try {    
  172.       String [] files = new String[] {USER_DIR+"/a.txt.x", USER_DIR+"/ax",
  173.                                       USER_DIR+"/ab37x", USER_DIR+"/bacd"};
  174.       Path[] matchedPath = prepareTesting(USER_DIR+"/a*x", files);
  175.       assertEquals(matchedPath.length, 3);
  176.       assertEquals(matchedPath[0], path[0]);
  177.       assertEquals(matchedPath[1], path[2]);
  178.       assertEquals(matchedPath[2], path[1]);
  179.     } finally {
  180.       cleanupDFS();
  181.     } 
  182.   }
  183.   private void pTestClosure4() throws IOException {
  184.     try {
  185.       String [] files = new String[] {USER_DIR+"/dir1/file1", 
  186.                                       USER_DIR+"/dir2/file2", 
  187.                                        USER_DIR+"/dir3/file1"};
  188.       Path[] matchedPath = prepareTesting(USER_DIR+"/*/file1", files);
  189.       assertEquals(matchedPath.length, 2);
  190.       assertEquals(matchedPath[0], path[0]);
  191.       assertEquals(matchedPath[1], path[2]);
  192.     } finally {
  193.       cleanupDFS();
  194.     }
  195.   }
  196.   
  197.   private void pTestClosure5() throws IOException {
  198.     try {
  199.       String [] files = new String[] {USER_DIR+"/dir1/file1", 
  200.                                       USER_DIR+"/file1"};
  201.       Path[] matchedPath = prepareTesting(USER_DIR+"/*/file1", files);
  202.       assertEquals(matchedPath.length, 1);
  203.       assertEquals(matchedPath[0], path[0]);
  204.     } finally {
  205.       cleanupDFS();
  206.     }
  207.   }
  208.   private void pTestSet() throws IOException {
  209.     try {    
  210.       String [] files = new String[] {USER_DIR+"/a.c", USER_DIR+"/a.cpp",
  211.                                       USER_DIR+"/a.hlp", USER_DIR+"/a.hxy"};
  212.       Path[] matchedPath = prepareTesting(USER_DIR+"/a.[ch]??", files);
  213.       assertEquals(matchedPath.length, 3);
  214.       assertEquals(matchedPath[0], path[1]);
  215.       assertEquals(matchedPath[1], path[2]);
  216.       assertEquals(matchedPath[2], path[3]);
  217.     } finally {
  218.       cleanupDFS();
  219.     }
  220.   }
  221.   
  222.   private void pTestRange() throws IOException {
  223.     try {    
  224.       String [] files = new String[] {USER_DIR+"/a.d", USER_DIR+"/a.e",
  225.                                       USER_DIR+"/a.f", USER_DIR+"/a.h"};
  226.       Path[] matchedPath = prepareTesting(USER_DIR+"/a.[d-fm]", files);
  227.       assertEquals(matchedPath.length, 3);
  228.       assertEquals(matchedPath[0], path[0]);
  229.       assertEquals(matchedPath[1], path[1]);
  230.       assertEquals(matchedPath[2], path[2]);
  231.     } finally {
  232.       cleanupDFS();
  233.     }
  234.   }
  235.   
  236.   private void pTestSetExcl() throws IOException {
  237.     try {    
  238.       String [] files = new String[] {USER_DIR+"/a.d", USER_DIR+"/a.e",
  239.                                       USER_DIR+"/a.0", USER_DIR+"/a.h"};
  240.       Path[] matchedPath = prepareTesting(USER_DIR+"/a.[^a-cg-z0-9]", files);
  241.       assertEquals(matchedPath.length, 2);
  242.       assertEquals(matchedPath[0], path[0]);
  243.       assertEquals(matchedPath[1], path[1]);
  244.     } finally {
  245.       cleanupDFS();
  246.     }
  247.   }
  248.   private void pTestCombination() throws IOException {
  249.     try {    
  250.       String [] files = new String[] {"/user/aa/a.c", "/user/bb/a.cpp",
  251.                                       "/user1/cc/b.hlp", "/user/dd/a.hxy"};
  252.       Path[] matchedPath = prepareTesting("/use?/*/a.[ch]{lp,xy}", files);
  253.       assertEquals(matchedPath.length, 1);
  254.       assertEquals(matchedPath[0], path[3]);
  255.     } finally {
  256.       cleanupDFS();
  257.     }
  258.   }
  259.   
  260.   private void pTestRelativePath() throws IOException {
  261.     try {
  262.       String [] files = new String[] {"a", "abc", "abc.p", "bacd"};
  263.       Path[] matchedPath = prepareTesting("a*", files);
  264.       assertEquals(matchedPath.length, 3);
  265.       assertEquals(matchedPath[0], new Path(USER_DIR, path[0]));
  266.       assertEquals(matchedPath[1], new Path(USER_DIR, path[1]));
  267.       assertEquals(matchedPath[2], new Path(USER_DIR, path[2]));
  268.     } finally {
  269.       cleanupDFS();
  270.     }
  271.   }
  272.   
  273.   /* Test {xx,yy} */
  274.   private void pTestCurlyBracket() throws IOException {
  275.     Path[] matchedPath;
  276.     String [] files;
  277.     try {
  278.       files = new String[] { USER_DIR+"/a.abcxx", USER_DIR+"/a.abxy",
  279.                              USER_DIR+"/a.hlp", USER_DIR+"/a.jhyy"};
  280.       matchedPath = prepareTesting(USER_DIR+"/a.{abc,jh}??", files);
  281.       assertEquals(matchedPath.length, 2);
  282.       assertEquals(matchedPath[0], path[0]);
  283.       assertEquals(matchedPath[1], path[3]);
  284.     } finally {
  285.       cleanupDFS();
  286.     }
  287.     // nested curlies
  288.     try {
  289.       files = new String[] { USER_DIR+"/a.abcxx", USER_DIR+"/a.abdxy",
  290.                              USER_DIR+"/a.hlp", USER_DIR+"/a.jhyy" };
  291.       matchedPath = prepareTesting(USER_DIR+"/a.{ab{c,d},jh}??", files);
  292.       assertEquals(matchedPath.length, 3);
  293.       assertEquals(matchedPath[0], path[0]);
  294.       assertEquals(matchedPath[1], path[1]);
  295.       assertEquals(matchedPath[2], path[3]);
  296.     } finally {
  297.       cleanupDFS();
  298.     }
  299.     // cross-component curlies
  300.     try {
  301.       files = new String[] { USER_DIR+"/a/b", USER_DIR+"/a/d",
  302.                              USER_DIR+"/c/b", USER_DIR+"/c/d" };
  303.       matchedPath = prepareTesting(USER_DIR+"/{a/b,c/d}", files);
  304.       assertEquals(matchedPath.length, 2);
  305.       assertEquals(matchedPath[0], path[0]);
  306.       assertEquals(matchedPath[1], path[3]);
  307.     } finally {
  308.       cleanupDFS();
  309.     }
  310.     // cross-component absolute curlies
  311.     try {
  312.       files = new String[] { "/a/b", "/a/d",
  313.                              "/c/b", "/c/d" };
  314.       matchedPath = prepareTesting("{/a/b,/c/d}", files);
  315.       assertEquals(matchedPath.length, 2);
  316.       assertEquals(matchedPath[0], path[0]);
  317.       assertEquals(matchedPath[1], path[3]);
  318.     } finally {
  319.       cleanupDFS();
  320.     }
  321.     try {
  322.       // test standalone }
  323.       files = new String[] {USER_DIR+"/}bc", USER_DIR+"/}c"};
  324.       matchedPath = prepareTesting(USER_DIR+"/}{a,b}c", files);
  325.       assertEquals(matchedPath.length, 1);
  326.       assertEquals(matchedPath[0], path[0]);
  327.       // test {b}
  328.       matchedPath = prepareTesting(USER_DIR+"/}{b}c", files);
  329.       assertEquals(matchedPath.length, 1);
  330.       assertEquals(matchedPath[0], path[0]);
  331.       // test {}
  332.       matchedPath = prepareTesting(USER_DIR+"/}{}bc", files);
  333.       assertEquals(matchedPath.length, 1);
  334.       assertEquals(matchedPath[0], path[0]);
  335.       // test {,}
  336.       matchedPath = prepareTesting(USER_DIR+"/}{,}bc", files);
  337.       assertEquals(matchedPath.length, 1);
  338.       assertEquals(matchedPath[0], path[0]);
  339.       // test {b,}
  340.       matchedPath = prepareTesting(USER_DIR+"/}{b,}c", files);
  341.       assertEquals(matchedPath.length, 2);
  342.       assertEquals(matchedPath[0], path[0]);
  343.       assertEquals(matchedPath[1], path[1]);
  344.       // test {,b}
  345.       matchedPath = prepareTesting(USER_DIR+"/}{,b}c", files);
  346.       assertEquals(matchedPath.length, 2);
  347.       assertEquals(matchedPath[0], path[0]);
  348.       assertEquals(matchedPath[1], path[1]);
  349.       // test a combination of {} and ?
  350.       matchedPath = prepareTesting(USER_DIR+"/}{ac,?}", files);
  351.       assertEquals(matchedPath.length, 1);
  352.       assertEquals(matchedPath[0], path[1]);
  353.       
  354.       // test ill-formed curly
  355.       boolean hasException = false;
  356.       try {
  357.         prepareTesting(USER_DIR+"}{bc", files);
  358.       } catch (IOException e) {
  359.         assertTrue(e.getMessage().startsWith("Illegal file pattern:") );
  360.         hasException = true;
  361.       }
  362.       assertTrue(hasException);
  363.     } finally {
  364.       cleanupDFS();
  365.     }
  366.   }
  367.   
  368.   /* test that a path name can contain Java regex special characters */
  369.   private void pTestJavaRegexSpecialChars() throws IOException {
  370.     try {
  371.       String[] files = new String[] {USER_DIR+"/($.|+)bc", USER_DIR+"/abc"};
  372.       Path[] matchedPath = prepareTesting(USER_DIR+"/($.|+)*", files);
  373.       assertEquals(matchedPath.length, 1);
  374.       assertEquals(matchedPath[0], path[0]);
  375.     } finally {
  376.       cleanupDFS();
  377.     }
  378.   }
  379.   private Path[] prepareTesting(String pattern, String[] files)
  380.     throws IOException {
  381.     for(int i=0; i<Math.min(NUM_OF_PATHS, files.length); i++) {
  382.       path[i] = new Path(files[i]).makeQualified(fs);
  383.       if (!fs.mkdirs(path[i])) {
  384.         throw new IOException("Mkdirs failed to create " + path[i].toString());
  385.       }
  386.     }
  387.     Path patternPath = new Path(pattern);
  388.     Path[] globResults = FileUtil.stat2Paths(fs.globStatus(patternPath),
  389.                                              patternPath);
  390.     for(int i=0; i<globResults.length; i++) {
  391.       globResults[i] = globResults[i].makeQualified(fs);
  392.     }
  393.     return globResults;
  394.   }
  395.   
  396.   private Path[] prepareTesting(String pattern, String[] files,
  397.       PathFilter filter) throws IOException {
  398.     for(int i=0; i<Math.min(NUM_OF_PATHS, files.length); i++) {
  399.       path[i] = new Path(files[i]).makeQualified(fs);
  400.       if (!fs.mkdirs(path[i])) {
  401.         throw new IOException("Mkdirs failed to create " + path[i].toString());
  402.       }
  403.     }
  404.     Path patternPath = new Path(pattern);
  405.     Path[] globResults = FileUtil.stat2Paths(fs.globStatus(patternPath, filter),
  406.                                              patternPath);
  407.     for(int i=0; i<globResults.length; i++) {
  408.       globResults[i] = globResults[i].makeQualified(fs);
  409.     }
  410.     return globResults;
  411.   }
  412.   
  413.   private void cleanupDFS() throws IOException {
  414.     fs.delete(new Path("/user"), true);
  415.   }
  416.   
  417. }