/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.ambari.server.utils; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.LinkedList; import java.util.List; import org.junit.Test; import junit.framework.Assert; /** * Tests parallel loops */ public class TestParallel { /** * Tests {@link org.apache.ambari.server.utils.Parallel} forLoop base cases. * @throws Exception */ @Test public void testParallelForLoopBaseCases() throws Exception { ParallelLoopResult<Integer> nullLoopResult = Parallel.forLoop( null, new LoopBody<Integer, Integer>() { @Override public Integer run(Integer integer) { return integer; } }); Assert.assertTrue(nullLoopResult.getIsCompleted()); Assert.assertTrue(nullLoopResult.getResult().isEmpty()); ParallelLoopResult<Integer> emptyLoopResult = Parallel.forLoop( new ArrayList<Integer>(), new LoopBody<Integer, Integer>() { @Override public Integer run(Integer integer) { return integer; } }); Assert.assertTrue(emptyLoopResult.getIsCompleted()); Assert.assertTrue(emptyLoopResult.getResult().isEmpty()); ParallelLoopResult<Integer> singleElementLoopResult = Parallel.forLoop( Collections.singletonList(7), new LoopBody<Integer, Integer>() { @Override public Integer run(Integer integer) { return integer; } }); Assert.assertTrue(singleElementLoopResult.getIsCompleted()); List<Integer> singleElementList = singleElementLoopResult.getResult(); Assert.assertTrue(singleElementLoopResult.getIsCompleted()); Assert.assertFalse(singleElementList.isEmpty()); Assert.assertEquals(1, singleElementList.size()); Assert.assertNotNull(singleElementList.get(0)); } /** * Tests Parallel.forLoop * @throws Exception */ @Test public void testParallelForLoop() throws Exception { final List<Integer> input = new LinkedList<>(); for(int i = 0; i < 10; i++) { input.add(i); } ParallelLoopResult<Integer> loopResult = Parallel.forLoop(input, new LoopBody<Integer, Integer>() { @Override public Integer run(Integer in1) { return in1 * in1; } }); Assert.assertTrue(loopResult.getIsCompleted()); Assert.assertNotNull(loopResult.getResult()); List<Integer> output = loopResult.getResult(); Assert.assertEquals(input.size(), output.size()); for(int i = 0; i < input.size(); i++) { Assert.assertEquals( i * i, (int)output.get(i)); } } /** * Tests nested {@link org.apache.ambari.server.utils.Parallel} forLoop * @throws Exception */ @Test public void testNestedParallelForLoop() throws Exception { final List<Integer> input = new LinkedList<>(); for(int i = 0; i < 10; i++) { input.add(i); } final ParallelLoopResult<Integer>[] innerLoopResults = new ParallelLoopResult[input.size()]; ParallelLoopResult<Integer> loopResult = Parallel.forLoop(input, new LoopBody<Integer, Integer>() { @Override public Integer run(final Integer in1) { int sq = in1 * in1; ParallelLoopResult<Integer> innerLoopResult = Parallel.forLoop(input, new LoopBody<Integer, Integer>() { @Override public Integer run(Integer in2) { return in1 * in2; } }); innerLoopResults[in1] = innerLoopResult; return in1 * in1; } }); Assert.assertNotNull(loopResult); Assert.assertTrue(loopResult.getIsCompleted()); List<Integer> output = loopResult.getResult(); Assert.assertNotNull(output); Assert.assertEquals(input.size(), output.size()); for(int i = 0; i < input.size(); i++) { Assert.assertEquals(i * i, (int) output.get(i)); ParallelLoopResult<Integer> innerLoopResult = innerLoopResults[i]; Assert.assertNotNull(innerLoopResult); Assert.assertTrue(innerLoopResult.getIsCompleted()); List<Integer> innerOutput = innerLoopResult.getResult(); Assert.assertNotNull(innerOutput); Assert.assertEquals(input.size(), innerOutput.size()); for(int j = 0; j < input.size(); j++) { Assert.assertEquals(i*j, (int) innerOutput.get(j)); } } } /** * Tests {@link org.apache.ambari.server.utils.Parallel} forLoop iteration failures * @throws Exception */ @Test public void testParallelForLoopIterationFailures() throws Exception { final List<Integer> input = new LinkedList<>(); for(int i = 0; i < 10; i++) { input.add(i); } final List<Integer> failForList = Arrays.asList(new Integer[] { 2, 5, 7}); ParallelLoopResult<Integer> loopResult = Parallel.forLoop(input, new LoopBody<Integer, Integer>() { @Override public Integer run(Integer in1) { if(failForList.contains(in1)) { // Return null return null; } return in1 * in1; } }); Assert.assertFalse(loopResult.getIsCompleted()); Assert.assertNotNull(loopResult.getResult()); List<Integer> output = loopResult.getResult(); Assert.assertEquals(input.size(), output.size()); for(int i = 0; i < input.size(); i++) { if(failForList.contains(i)) { Assert.assertNull(output.get(i)); output.set(i, i * i); } else { Assert.assertEquals(i * i, (int) output.get(i)); } } } /** * Tests {@link org.apache.ambari.server.utils.Parallel} forLoop iteration exceptions * @throws Exception */ @Test public void testParallelForLoopIterationExceptions() throws Exception { final List<Integer> input = new LinkedList<>(); for(int i = 0; i < 10; i++) { input.add(i); } final List<Integer> failForList = Arrays.asList(new Integer[] { 2, 5, 7}); ParallelLoopResult<Integer> loopResult = Parallel.forLoop(input, new LoopBody<Integer, Integer>() { @Override public Integer run(Integer in1) { if(failForList.contains(in1)) { throw new RuntimeException("Ignore this exception"); } return in1 * in1; } }); Assert.assertFalse(loopResult.getIsCompleted()); Assert.assertNotNull(loopResult.getResult()); List<Integer> output = loopResult.getResult(); Assert.assertEquals(input.size(), output.size()); for(int i = 0; i < input.size(); i++) { if(failForList.contains(i)) { Assert.assertNull(output.get(i)); output.set(i, i * i); } else { Assert.assertEquals(i * i, (int) output.get(i)); } } } }