/* * Copyright 1999-2006 University of Chicago * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.dcache.ftp.client.test; import org.dcache.ftp.client.ByteRange; import org.dcache.ftp.client.ByteRangeList; import java.util.Vector; import junit.framework.TestCase; import junit.framework.Test; import junit.framework.TestSuite; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** Test ByteRangeList **/ public class ByteRangeListTest extends TestCase { private static Logger logger = LoggerFactory.getLogger(ByteRangeListTest.class); public static void main(String[] argv) { junit.textui.TestRunner.run (suite()); } public static Test suite() { return new TestSuite(ByteRangeListTest.class); } public ByteRangeListTest(String name) { super(name); } /** Test merging ByteRange to ByteRangeList. Systematic test of most cases. Tests merge() and toFtpCmdArgument(). Assure that merge() does not modify parameter objects. **/ public void test1() { Vector v = new Vector(); v.add(new ByteRange(12, 17)); v.add(new ByteRange(24, 26)); v.add(new ByteRange(31, 31)); v.add(new ByteRange(40, 45)); v.add(new ByteRange(52, 52)); // t = vector // o = new range // t t t t t = // "12-17 24-26 31-31 40-45 52-52" // o t t t t t assertMerge1(v, 0,5, "0-5,12-17,24-26,31-31,40-45,52-52"); // ot t t t t assertMerge1(v, 7,11, "7-17,24-26,31-31,40-45,52-52"); // o-t t t t t assertMerge1(v, 3,15, "3-17,24-26,31-31,40-45,52-52"); // o-o t t t t assertMerge1(v, 10,18, "10-18,24-26,31-31,40-45,52-52"); // o-ot t t t assertMerge1(v, 10,23, "10-26,31-31,40-45,52-52"); // o-o-t t t t assertMerge1(v, 10,30, "10-31,40-45,52-52"); // o-o-o-o- t assertMerge1(v, 10,50, "10-50,52-52"); // o-o-o-o-o-o assertMerge1(v, 10,53, "10-53"); // t-t t t t t assertMerge1(v, 13,16, "12-17,24-26,31-31,40-45,52-52"); // - t t t t assertMerge1(v, 12,17, "12-17,24-26,31-31,40-45,52-52"); // t-o-o-t t t assertMerge1(v, 16,31, "12-31,40-45,52-52"); // -o-o-o-o-o assertMerge1(v, 12,100, "12-100"); // t o t t t t assertMerge1(v, 24,26, "12-17,24-26,31-31,40-45,52-52"); // t ot t t t assertMerge1(v, 20,23, "12-17,20-26,31-31,40-45,52-52"); // t o-o t t t assertMerge1(v, 20,29, "12-17,20-29,31-31,40-45,52-52"); // t o-ot t t assertMerge1(v, 20,30, "12-17,20-31,40-45,52-52"); // t o-o-o-o t assertMerge1(v, 20,49, "12-17,20-49,52-52"); // t to t t t assertMerge1(v, 27,27, "12-17,24-27,31-31,40-45,52-52"); // t tot t t assertMerge1(v, 27,30, "12-17,24-31,40-45,52-52"); // t to-ot t assertMerge1(v, 26,40, "12-17,24-45,52-52"); // t t t tot assertMerge1(v, 46,51, "12-17,24-26,31-31,40-52"); // t t t t o-t assertMerge1(v, 51,52, "12-17,24-26,31-31,40-45,51-52"); // t t t t -o assertMerge1(v, 52,53, "12-17,24-26,31-31,40-45,52-53"); // t t t t t o assertMerge1(v, 54,67, "12-17,24-26,31-31,40-45,52-52,54-67"); } /** real case (taken from transfer of 500 MB) **/ public void test2() { Vector v = new Vector(); v.add(new ByteRange(0, 134545408)); v.add(new ByteRange(134545408, 298778624)); assertMerge1(v, 298778624, 466747392, "0-466747392"); } /** Ad hoc tests of interesting merge cases. Test merging several ranges into 1 list. Test merge() and toFtpCmdArgument(). **/ public void test3() { //merge 2 -> 1 Vector v = new Vector();; v.add(new ByteRange(1,3)); v.add(new ByteRange(4,6)); assertMerge(v,"1-6"); //merge 3 -> 1, 2, or 3 v = new Vector(); v.add(new ByteRange(1,3)); v.add(new ByteRange(5,19)); v.add(new ByteRange(4,6)); assertMerge(v, "1-19"); v = new Vector(); v.add(new ByteRange(1,3)); v.add(new ByteRange(9,19)); v.add(new ByteRange(4,6)); assertMerge(v, "1-6,9-19"); v = new Vector(); v.add(new ByteRange(1,3)); v.add(new ByteRange(9,19)); v.add(new ByteRange(6,12)); assertMerge(v, "1-3,6-19"); v = new Vector(); v.add(new ByteRange(1,3)); v.add(new ByteRange(9,19)); v.add(new ByteRange(6,12)); assertMerge(v, "1-3,6-19"); v = new Vector(); v.add(new ByteRange(1,3)); v.add(new ByteRange(9,19)); v.add(new ByteRange(0,2)); assertMerge(v, "0-3,9-19"); v = new Vector(); v.add(new ByteRange(1,3)); v.add(new ByteRange(9,19)); v.add(new ByteRange(0,12)); assertMerge(v, "0-19"); //large number first v = new Vector(); v.add(new ByteRange(50,64)); v.add(new ByteRange(9,19)); v.add(new ByteRange(6,12)); assertMerge(v, "6-19,50-64"); v = new Vector(); v.add(new ByteRange(50,64)); v.add(new ByteRange(9,19)); v.add(new ByteRange(6,7)); assertMerge(v, "6-7,9-19,50-64"); //2 identical v = new Vector(); v.add(new ByteRange(6,7)); v.add(new ByteRange(9,19)); v.add(new ByteRange(6,7)); assertMerge(v, "6-7,9-19"); v = new Vector(); v.add(new ByteRange(30,40)); v.add(new ByteRange(6,7)); v.add(new ByteRange(30,40)); v.add(new ByteRange(6,7)); assertMerge(v, "6-7,30-40"); //1 superset v = new Vector(); v.add(new ByteRange(30,40)); v.add(new ByteRange(6,7)); v.add(new ByteRange(35,50)); v.add(new ByteRange(3,100)); assertMerge(v, "3-100"); v = new Vector(); v.add(new ByteRange(3,100)); v.add(new ByteRange(6,7)); v.add(new ByteRange(35,50)); v.add(new ByteRange(30,40)); assertMerge(v, "3-100"); //singletons v = new Vector(); v.add(new ByteRange(3,3)); v.add(new ByteRange(6,7)); v.add(new ByteRange(1,1)); v.add(new ByteRange(8,8)); assertMerge(v, "1-1,3-3,6-8"); v = new Vector(); v.add(new ByteRange(3,3)); v.add(new ByteRange(4,4)); v.add(new ByteRange(1,1)); v.add(new ByteRange(2,2)); assertMerge(v, "1-4"); } /** Create ByteRangeList from vector v, merge with new ByteRange(from, to), assure it renders toFtpCmdArgument() as expectedResult and that original vector and range did not change. Test merge(Vector), merge(ByteRange), toFtpCmdArgument() and **/ private void assertMerge1(Vector v, int from, int to, String expectedResult) { ByteRangeList list = new ByteRangeList(); list.merge(v); ByteRange newRange = new ByteRange(from, to); String vBefore = list.toFtpCmdArgument(); String rBefore = newRange.toString(); logger.info("merging range: " + vBefore + " + " + rBefore); // test merge list.merge(newRange); String actualResult = list.toFtpCmdArgument(); logger.debug(" -> " + actualResult); assertTrue(expectedResult.equals(actualResult)); logger.debug("ok, merged as expected."); // original vector and range did not change? ByteRangeList list2 = new ByteRangeList(); list2.merge(v); String vAfter = list2.toFtpCmdArgument(); String rAfter = newRange.toString(); assertTrue(vBefore.equals(vAfter)); assertTrue(rBefore.equals(rAfter)); logger.debug("ok, original objects intact"); }; /** Merge vector into a new ByteRangeList. Test merge(ByteRange), merge(Vector), toFtpCmdArgument(). **/ private void assertMerge(Vector v, String result) { logger.info("merging vector of ranges: " + result); ByteRangeList list1 = new ByteRangeList(); for (int i=0; i<v.size(); i++) { list1.merge((ByteRange)v.elementAt(i)); } logger.debug(" -> " + list1.toFtpCmdArgument()); assertTrue(list1.toFtpCmdArgument().equals(result)); logger.debug("merging one by one again.."); ByteRangeList list3 = new ByteRangeList(); for (int i=0; i<v.size(); i++) { list3.merge((ByteRange)v.elementAt(i)); } logger.debug(" .. -> " + list3.toFtpCmdArgument()); assertTrue(list3.toFtpCmdArgument().equals(result)); logger.debug("merging vector at once"); ByteRangeList list2 = new ByteRangeList(); list2.merge(v); logger.debug(" .. -> " + list2.toFtpCmdArgument()); assertTrue(list2.toFtpCmdArgument().equals(result)); } }