/* * Copyright 2008-2013 LinkedIn, Inc * * 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 voldemort.utils; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import org.junit.Test; import voldemort.VoldemortException; public class UtilsTest { @Test public void testSorted() { assertEquals(Collections.EMPTY_LIST, Utils.sorted(new ArrayList<Integer>())); assertEquals(Arrays.asList(1), Utils.sorted(Arrays.asList(1))); assertEquals(Arrays.asList(1, 2, 3, 4), Utils.sorted(Arrays.asList(4, 3, 2, 1))); } @Test public void testReversed() { assertEquals(Collections.EMPTY_LIST, Utils.sorted(new ArrayList<Integer>())); assertEquals(Arrays.asList(1, 2, 3, 4), Utils.sorted(Arrays.asList(4, 3, 2, 1))); } @Test public void testMkDir() { File tempDir = new File(System.getProperty("java.io.tmpdir"), "temp" + System.currentTimeMillis()); // Working case Utils.mkdirs(tempDir); assertTrue(tempDir.exists()); // Exists & writable false tempDir.setWritable(false); try { Utils.mkdirs(tempDir); fail("Mkdir should have thrown an exception"); } catch(VoldemortException e) {} } @Test public void testSymlink() throws IOException { String tempParentDir = System.getProperty("java.io.tmpdir"); File tempDir = new File(tempParentDir, "temp" + (System.currentTimeMillis() + 1)); File tempSymLink = new File(tempParentDir, "link" + (System.currentTimeMillis() + 2)); File tempDir2 = new File(tempParentDir, "temp" + (System.currentTimeMillis() + 3)); // Test against non-existing directory assertTrue(!tempDir.exists()); try { Utils.symlink(tempDir.getAbsolutePath(), tempSymLink.getAbsolutePath()); fail("Symlink should have thrown an exception since directory did not exist"); } catch(VoldemortException e) {} // Normal test Utils.mkdirs(tempDir); try { Utils.symlink(tempDir.getAbsolutePath(), tempSymLink.getAbsolutePath()); } catch(VoldemortException e) { fail("Test against non-existing symlink"); } assertTrue(!Utils.isSymLink(tempDir)); assertTrue(Utils.isSymLink(tempSymLink)); // Test if existing sym-link can switch to new directory Utils.mkdirs(tempDir2); try { Utils.symlink(tempDir2.getAbsolutePath(), tempSymLink.getAbsolutePath()); } catch(VoldemortException e) { e.printStackTrace(); fail("Test against already existing symlink "); } assertTrue(Utils.isSymLink(tempSymLink)); // Check if it was not deleted with sym-link assertTrue(tempDir.exists()); File dumbFile = new File(tempDir2, "dumbFile"); dumbFile.createNewFile(); assertEquals(1, tempSymLink.list().length); } @Test public void testRemoveItemsToSplitListEvenly() { // input of size 5 List<Integer> input = new ArrayList<Integer>(); System.out.println("Input of size 5"); for(int i = 0; i < 5; ++i) { input.add(i); } List<Integer> output = Utils.removeItemsToSplitListEvenly(input, 1); assertEquals(output.size(), 2); assertEquals(output.get(0), new Integer(1)); assertEquals(output.get(1), new Integer(3)); System.out.println("1 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 2); assertEquals(output.size(), 1); assertEquals(output.get(0), new Integer(2)); System.out.println("2 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 3); assertEquals(output.size(), 1); assertEquals(output.get(0), new Integer(2)); System.out.println("3 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 4); assertEquals(output.size(), 1); assertEquals(output.get(0), new Integer(2)); System.out.println("4 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 5); assertEquals(output.size(), 0); System.out.println("5 : " + output); // input of size 10 input.clear(); System.out.println("Input of size 10"); for(int i = 0; i < 10; ++i) { input.add(i); } output = Utils.removeItemsToSplitListEvenly(input, 1); assertEquals(output.size(), 5); assertEquals(output.get(0), new Integer(1)); assertEquals(output.get(4), new Integer(9)); System.out.println("1 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 2); assertEquals(output.size(), 3); assertEquals(output.get(0), new Integer(2)); assertEquals(output.get(2), new Integer(8)); System.out.println("2 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 3); assertEquals(output.size(), 2); assertEquals(output.get(0), new Integer(3)); assertEquals(output.get(1), new Integer(7)); System.out.println("3 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 4); assertEquals(output.size(), 2); assertEquals(output.get(0), new Integer(3)); assertEquals(output.get(1), new Integer(7)); System.out.println("4 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 5); assertEquals(output.size(), 1); assertEquals(output.get(0), new Integer(5)); System.out.println("5 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 6); assertEquals(output.size(), 1); assertEquals(output.get(0), new Integer(5)); System.out.println("6 : " + output); // input of size 20 input.clear(); System.out.println("Input of size 20"); for(int i = 0; i < 20; ++i) { input.add(i); } output = Utils.removeItemsToSplitListEvenly(input, 1); assertEquals(output.size(), 10); assertEquals(output.get(0), new Integer(1)); assertEquals(output.get(9), new Integer(19)); System.out.println("1 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 2); assertEquals(output.size(), 6); assertEquals(output.get(0), new Integer(2)); assertEquals(output.get(5), new Integer(17)); System.out.println("2 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 3); assertEquals(output.size(), 5); assertEquals(output.get(0), new Integer(3)); assertEquals(output.get(4), new Integer(17)); System.out.println("3 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 4); assertEquals(output.size(), 4); assertEquals(output.get(0), new Integer(4)); assertEquals(output.get(3), new Integer(16)); System.out.println("4 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 5); assertEquals(output.size(), 3); assertEquals(output.get(0), new Integer(5)); assertEquals(output.get(2), new Integer(15)); System.out.println("5 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 6); assertEquals(output.size(), 2); assertEquals(output.get(0), new Integer(6)); assertEquals(output.get(1), new Integer(13)); System.out.println("6 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 7); assertEquals(output.size(), 2); assertEquals(output.get(0), new Integer(6)); assertEquals(output.get(1), new Integer(13)); System.out.println("7 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 9); assertEquals(output.size(), 2); assertEquals(output.get(0), new Integer(6)); assertEquals(output.get(1), new Integer(13)); System.out.println("9 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 10); assertEquals(output.size(), 1); assertEquals(output.get(0), new Integer(10)); System.out.println("10 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 11); assertEquals(output.size(), 1); assertEquals(output.get(0), new Integer(10)); System.out.println("11 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 19); assertEquals(output.size(), 1); assertEquals(output.get(0), new Integer(10)); System.out.println("19 : " + output); output = Utils.removeItemsToSplitListEvenly(input, 20); assertEquals(output.size(), 0); System.out.println("20 : " + output); } @Test public void testPeanutButterList() { List<Integer> pbList; pbList = Utils.distributeEvenlyIntoList(4, 4); assertEquals(pbList.size(), 4); assertEquals(pbList.get(0), new Integer(1)); assertEquals(pbList.get(1), new Integer(1)); assertEquals(pbList.get(2), new Integer(1)); assertEquals(pbList.get(3), new Integer(1)); pbList = Utils.distributeEvenlyIntoList(4, 6); assertEquals(pbList.size(), 4); assertEquals(pbList.get(0), new Integer(2)); assertEquals(pbList.get(1), new Integer(2)); assertEquals(pbList.get(2), new Integer(1)); assertEquals(pbList.get(3), new Integer(1)); pbList = Utils.distributeEvenlyIntoList(4, 3); assertEquals(pbList.size(), 4); assertEquals(pbList.get(0), new Integer(1)); assertEquals(pbList.get(1), new Integer(1)); assertEquals(pbList.get(2), new Integer(1)); assertEquals(pbList.get(3), new Integer(0)); pbList = Utils.distributeEvenlyIntoList(4, 0); assertEquals(pbList.size(), 4); assertEquals(pbList.get(0), new Integer(0)); assertEquals(pbList.get(1), new Integer(0)); assertEquals(pbList.get(2), new Integer(0)); assertEquals(pbList.get(3), new Integer(0)); boolean caught = false; try { pbList = Utils.distributeEvenlyIntoList(0, 10); } catch(IllegalArgumentException iae) { caught = true; } assertTrue(caught); caught = false; try { pbList = Utils.distributeEvenlyIntoList(4, -5); } catch(IllegalArgumentException iae) { caught = true; } assertTrue(caught); } @Test public void testSafePercentage() { assertEquals(Utils.safeGetPercentage(0.0f, 0.0f), 0); assertEquals(Utils.safeGetPercentage(100.0f, 0.0f), 0); assertEquals(Utils.safeGetPercentage(100.0f, 200.0f), 50); assertEquals(Utils.safeGetPercentage(100.0f, 50.0f), 200); } }