// 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.builder; import org.junit.Before; import org.junit.Test; import com.twitter.heron.common.basics.ByteAmount; import com.twitter.heron.packing.ResourceExceededException; import com.twitter.heron.spi.packing.Resource; import com.twitter.heron.spi.utils.PackingTestUtils; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; /** * Tests scorers. Testing multiple scorers from a single test since the tests are so simple. */ public class ScorerTest { private Container[] testContainers; @Before public void init() throws ResourceExceededException { Resource containerCapacity = new Resource(1000, ByteAmount.fromGigabytes(100), ByteAmount.fromGigabytes(100)); testContainers = new Container[] { new Container(1, containerCapacity, 0), new Container(3, containerCapacity, 0), new Container(4, containerCapacity, 0), }; addInstance(testContainers[0], "A", 0); addInstance(testContainers[0], "A", 1); addInstance(testContainers[0], "B", 2); addInstance(testContainers[0], "B", 3); addInstance(testContainers[1], "A", 4); addInstance(testContainers[1], "B", 5); addInstance(testContainers[1], "B", 6); addInstance(testContainers[2], "A", 7); addInstance(testContainers[2], "A", 8); } @Test public void testHomogeneityScorer() { assertScores( new double[] {.5, 1.0 / 3, 1}, false, new HomogeneityScorer("A", false), testContainers); assertScores( new double[] {.5, 2.0 / 3, 0}, false, new HomogeneityScorer("B", false), testContainers); } @Test public void testHomogeneityScorerBinary() { assertScores(new double[] {0, 0, 1}, false, new HomogeneityScorer("A", true), testContainers); } @Test public void testContainerIdScorer() { assertScores(new double[] {1, 3, 4}, true, new ContainerIdScorer(), testContainers); assertScores(new double[] {1, 3, 4}, false, new ContainerIdScorer(false), testContainers); } @Test public void testContainerIdScorerFromId() { assertScores(new double[] {5, 0, 1}, true, new ContainerIdScorer(3, 4), testContainers); } @Test public void testInstanceCountScorer() { assertScores(new double[] {4, 3, 2}, true, new InstanceCountScorer(), testContainers); } private static void addInstance(Container container, String componentName, int taskId) throws ResourceExceededException { container.add(PackingTestUtils.testInstancePlan(componentName, taskId)); } private static void assertScores(double[] expectedScores, boolean expectedAscending, Scorer<Container> scorer, Container... containers) { double[] results = new double[containers.length]; int i = 0; for (Container container: containers) { results[i++] = scorer.getScore(container); } assertArrayEquals(expectedScores, results, 0.001); assertEquals(expectedAscending, scorer.sortAscending()); } }