// Copyright 2016 Twitter. All rights reserved. // // 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 com.twitter.heron.packing.utils; import java.util.HashMap; import java.util.Map; import org.junit.Assert; import org.junit.Test; import com.twitter.heron.api.generated.TopologyAPI; import com.twitter.heron.spi.common.Config; import com.twitter.heron.spi.common.Context; import com.twitter.heron.spi.packing.Resource; import com.twitter.heron.spi.utils.PackingTestUtils; import com.twitter.heron.spi.utils.TopologyTests; public class PackingUtilsTest { private static TopologyAPI.Topology getTopology( int spoutParallelism, int boltParallelism, com.twitter.heron.api.Config topologyConfig) { return TopologyTests.createTopology("testTopology", topologyConfig, "spout", "bolt", spoutParallelism, boltParallelism); } /** * Tests the increaseBy method for long values */ @Test public void testIncreaseByLong() { long value = 1024; int padding = 1; long expectedResult = 1034; Assert.assertEquals(expectedResult, PackingUtils.increaseBy(value, padding)); } /** * Tests the increaseBy method for double values */ @Test public void testIncreaseByDouble() { double value = 10.0; int padding = 1; double expectedResult = 10.1; Assert.assertEquals(0, Double.compare(PackingUtils.increaseBy(value, padding), expectedResult)); } /** * Tests the component scale up and down methods. */ @Test public void testComponentScaling() { Map<String, Integer> componentChanges = new HashMap<>(); componentChanges.put("spout", -2); componentChanges.put("bolt1", 2); componentChanges.put("bolt2", -1); Map<String, Integer> componentToScaleUp = PackingUtils.getComponentsToScale(componentChanges, PackingUtils.ScalingDirection.UP); Assert.assertEquals(1, componentToScaleUp.size()); Assert.assertEquals(2, (int) componentToScaleUp.get("bolt1")); Map<String, Integer> componentToScaleDown = PackingUtils.getComponentsToScale(componentChanges, PackingUtils.ScalingDirection.DOWN); Assert.assertEquals(2, componentToScaleDown.size()); Assert.assertEquals(-2, (int) componentToScaleDown.get("spout")); Assert.assertEquals(-1, (int) componentToScaleDown.get("bolt2")); } @Test public void testResourceScaleDown() { int noSpouts = 6; int noBolts = 3; int boltScalingDown = 2; com.twitter.heron.api.Config topologyConfig = new com.twitter.heron.api.Config(); TopologyAPI.Topology topology = getTopology(noSpouts, noBolts, topologyConfig); Config config = PackingTestUtils.newTestConfig(topology); Resource defaultInstanceResources = new Resource( Context.instanceCpu(config), Context.instanceRam(config), Context.instanceDisk(config)); Map<String, Integer> componentChanges = new HashMap<>(); componentChanges.put("bolt", -boltScalingDown); // 1 bolt Resource scaledownResource = PackingUtils.computeTotalResourceChange(topology, componentChanges, defaultInstanceResources, PackingUtils.ScalingDirection.DOWN); Assert.assertEquals((long) (boltScalingDown * defaultInstanceResources.getCpu()), (long) scaledownResource.getCpu()); Assert.assertEquals(defaultInstanceResources.getRam().multiply(boltScalingDown), scaledownResource.getRam()); Assert.assertEquals(defaultInstanceResources.getDisk().multiply(boltScalingDown), scaledownResource.getDisk()); } @Test public void testResourceScaleUp() { int noSpouts = 6; int noBolts = 3; int boltScalingUp = 2; com.twitter.heron.api.Config topologyConfig = new com.twitter.heron.api.Config(); TopologyAPI.Topology topology = getTopology(noSpouts, noBolts, topologyConfig); Config config = PackingTestUtils.newTestConfig(topology); Resource defaultInstanceResources = new Resource( Context.instanceCpu(config), Context.instanceRam(config), Context.instanceDisk(config)); Map<String, Integer> componentChanges = new HashMap<>(); componentChanges.put("bolt", boltScalingUp); // 5 bolts Resource scaleupResource = PackingUtils.computeTotalResourceChange(topology, componentChanges, defaultInstanceResources, PackingUtils.ScalingDirection.UP); Assert.assertEquals((long) (boltScalingUp * defaultInstanceResources.getCpu()), (long) scaleupResource.getCpu()); Assert.assertEquals(defaultInstanceResources.getRam().multiply(boltScalingUp), scaleupResource.getRam()); Assert.assertEquals(defaultInstanceResources.getDisk().multiply(boltScalingUp), scaleupResource.getDisk()); } }