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

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one or more
  3.  * contributor license agreements. See the NOTICE file distributed with this
  4.  * work for additional information regarding copyright ownership. The ASF
  5.  * licenses this file to you under the Apache License, Version 2.0 (the
  6.  * "License"); you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  * http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  13.  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  14.  * License for the specific language governing permissions and limitations under
  15.  * the License.
  16.  */
  17. package org.apache.hadoop.fs;
  18. import java.io.IOException;
  19. import java.util.Arrays;
  20. import java.util.Comparator;
  21. import java.util.Random;
  22. import junit.framework.TestCase;
  23. import org.apache.hadoop.conf.Configuration;
  24. /**
  25.  * Testing the correctness of FileSystem.getFileBlockLocations.
  26.  */
  27. public class TestGetFileBlockLocations extends TestCase {
  28.   private static String TEST_ROOT_DIR =
  29.       System.getProperty("test.build.data", "/tmp/testGetFileBlockLocations");
  30.   private static final int FileLength = 4 * 1024 * 1024; // 4MB
  31.   private Configuration conf;
  32.   private Path path;
  33.   private FileSystem fs;
  34.   private Random random;
  35.   /**
  36.    * @see TestCase#setUp()
  37.    */
  38.   @Override
  39.   protected void setUp() throws IOException {
  40.     conf = new Configuration();
  41.     Path rootPath = new Path(TEST_ROOT_DIR);
  42.     path = new Path(rootPath, "TestGetFileBlockLocations");
  43.     fs = rootPath.getFileSystem(conf);
  44.     FSDataOutputStream fsdos = fs.create(path, true);
  45.     byte[] buffer = new byte[1024];
  46.     while (fsdos.getPos() < FileLength) {
  47.       fsdos.write(buffer);
  48.     }
  49.     fsdos.close();
  50.     random = new Random(System.nanoTime());
  51.   }
  52.   private void oneTest(int offBegin, int offEnd, FileStatus status)
  53.       throws IOException {
  54.     if (offBegin > offEnd) {
  55.       int tmp = offBegin;
  56.       offBegin = offEnd;
  57.       offEnd = tmp;
  58.     }
  59.     BlockLocation[] locations =
  60.         fs.getFileBlockLocations(status, offBegin, offEnd - offBegin);
  61.     if (offBegin < status.getLen()) {
  62.       Arrays.sort(locations, new Comparator<BlockLocation>() {
  63.         @Override
  64.         public int compare(BlockLocation arg0, BlockLocation arg1) {
  65.           long cmprv = arg0.getOffset() - arg1.getOffset();
  66.           if (cmprv < 0) return -1;
  67.           if (cmprv > 0) return 1;
  68.           cmprv = arg0.getLength() - arg1.getLength();
  69.           if (cmprv < 0) return -1;
  70.           if (cmprv > 0) return 1;
  71.           return 0;
  72.         }
  73.       });
  74.       offBegin = (int) Math.min(offBegin, status.getLen() - 1);
  75.       offEnd = (int) Math.min(offEnd, status.getLen());
  76.       BlockLocation first = locations[0];
  77.       BlockLocation last = locations[locations.length - 1];
  78.       assertTrue(first.getOffset() <= offBegin);
  79.       assertTrue(offEnd <= last.getOffset() + last.getLength());
  80.     } else {
  81.       assertTrue(locations.length == 0);
  82.     }
  83.   }
  84.   /**
  85.    * @see TestCase#tearDown()
  86.    */
  87.   @Override
  88.   protected void tearDown() throws IOException {
  89.     fs.delete(path, true);
  90.     fs.close();
  91.   }
  92.   public void testFailureNegativeParameters() throws IOException {
  93.     FileStatus status = fs.getFileStatus(path);
  94.     try {
  95.       BlockLocation[] locations = fs.getFileBlockLocations(status, -1, 100);
  96.       fail("Expecting exception being throw");
  97.     } catch (IllegalArgumentException e) {
  98.     }
  99.     try {
  100.       BlockLocation[] locations = fs.getFileBlockLocations(status, 100, -1);
  101.       fail("Expecting exception being throw");
  102.     } catch (IllegalArgumentException e) {
  103.     }
  104.   }
  105.   public void testGetFileBlockLocations1() throws IOException {
  106.     FileStatus status = fs.getFileStatus(path);
  107.     oneTest(0, (int) status.getLen(), status);
  108.     oneTest(0, (int) status.getLen() * 2, status);
  109.     oneTest((int) status.getLen() * 2, (int) status.getLen() * 4, status);
  110.     oneTest((int) status.getLen() / 2, (int) status.getLen() * 3, status);
  111.     for (int i = 0; i < 10; ++i) {
  112.       oneTest((int) status.getLen() * i / 10, (int) status.getLen() * (i + 1)
  113.           / 10, status);
  114.     }
  115.   }
  116.   public void testGetFileBlockLocations2() throws IOException {
  117.     FileStatus status = fs.getFileStatus(path);
  118.     for (int i = 0; i < 1000; ++i) {
  119.       int offBegin = random.nextInt((int) (2 * status.getLen()));
  120.       int offEnd = random.nextInt((int) (2 * status.getLen()));
  121.       oneTest(offBegin, offEnd, status);
  122.     }
  123.   }
  124. }