/* * Copyright 2014 the original author or authors. * * 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.springframework.xd.dirt.server.admin.deployment; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertSame; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import org.springframework.xd.dirt.cluster.Container; import org.springframework.xd.dirt.container.store.ContainerRepository; import org.springframework.xd.module.ModuleDefinition; import org.springframework.xd.module.ModuleDeploymentProperties; import org.springframework.xd.module.ModuleDescriptor; import org.springframework.xd.module.ModuleType; import org.springframework.xd.module.TestModuleDefinitions; /** * Tests for {@link ContainerMatcher} * * @author David Turanski * @author Ilayaperumal Gopinathan */ @RunWith(MockitoJUnitRunner.class) public class DefaultContainerMatcherTests { @Mock private ContainerRepository containerRepository; private ContainerMatcher containerMatcher = new ContainerMatcher(); private List<Container> containers = new ArrayList<Container>(); private ModuleDefinition moduleDefinition; private ModuleDeploymentProperties deploymentProperties; private ModuleDescriptor moduleDescriptor; @Before public void setUp() { moduleDefinition = TestModuleDefinitions.dummy("foo", ModuleType.processor); deploymentProperties = new ModuleDeploymentProperties(); moduleDescriptor = new ModuleDescriptor.Builder() .setModuleDefinition(moduleDefinition) .setGroup("test1") .setModuleLabel("amodule") .setIndex(0) .build(); Map<String, String> container1Attributes = new HashMap<String, String>(); container1Attributes.put("group", "group1"); container1Attributes.put("color", "green"); final Container container1 = new Container("container1", container1Attributes); Map<String, String> container2Attributes = new HashMap<String, String>(); container2Attributes.put("group", "group2"); container2Attributes.put("color", "green"); container2Attributes.put("size", "large"); final Container container2 = new Container("container2", container2Attributes); Map<String, String> container3Attributes = new HashMap<String, String>(); container3Attributes.put("group", "group2"); container3Attributes.put("color", "blue"); container3Attributes.put("size", "small"); final Container container3 = new Container("container3", container3Attributes); containers.add(container1); containers.add(container2); containers.add(container3); } @Test public void basicRoundRobin() { Collection<Container> matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(1, matched.size()); assertSame(containers.get(0), matched.iterator().next()); matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(1, matched.size()); assertSame(containers.get(1), matched.iterator().next()); matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(1, matched.size()); assertSame(containers.get(2), matched.iterator().next()); matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(1, matched.size()); assertSame(containers.get(0), matched.iterator().next()); } @Test public void matchWithCountLessThanNumberOfContainers() { deploymentProperties.setCount(2); Collection<Container> matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(2, matched.size()); Iterator<Container> matchedIterator = matched.iterator(); assertSame(containers.get(0), matchedIterator.next()); assertSame(containers.get(1), matchedIterator.next()); matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(2, matched.size()); matchedIterator = matched.iterator(); assertSame(containers.get(2), matchedIterator.next()); assertSame(containers.get(0), matchedIterator.next()); matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(2, matched.size()); matchedIterator = matched.iterator(); assertSame(containers.get(1), matchedIterator.next()); assertSame(containers.get(2), matchedIterator.next()); matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(2, matched.size()); matchedIterator = matched.iterator(); assertSame(containers.get(0), matchedIterator.next()); assertSame(containers.get(1), matchedIterator.next()); } @Test public void matchWithCountEqualToNumberOfContainers() { deploymentProperties.setCount(3); Collection<Container> matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(3, matched.size()); } @Test public void matchWithZeroCount() { deploymentProperties.setCount(0); Collection<Container> matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(3, matched.size()); } @Test public void matchWithCountGreaterThanToNumberOfContainers() { deploymentProperties.setCount(5); Collection<Container> matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(3, matched.size()); } @Test public void matchWithCriteria() { deploymentProperties.setCount(0); deploymentProperties.setCriteria("color=='green'"); Collection<Container> matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(2, matched.size()); Iterator<Container> matchedIterator = matched.iterator(); assertSame(containers.get(0), matchedIterator.next()); assertSame(containers.get(1), matchedIterator.next()); } @Test public void matchWithCountAndCriteria() { deploymentProperties.setCount(3); deploymentProperties.setCriteria("group=='group2'"); Collection<Container> matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(2, matched.size()); Iterator<Container> matchedIterator = matched.iterator(); assertSame(containers.get(1), matchedIterator.next()); assertSame(containers.get(2), matchedIterator.next()); matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(2, matched.size()); matchedIterator = matched.iterator(); assertSame(containers.get(1), matchedIterator.next()); assertSame(containers.get(2), matchedIterator.next()); } @Test public void matchWithCountLessThanContainersMatchingCriteria() { deploymentProperties.setCount(1); deploymentProperties.setCriteria("group=='group2'"); Collection<Container> matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(1, matched.size()); Iterator<Container> matchedIterator = matched.iterator(); assertSame(containers.get(1), matchedIterator.next()); matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(1, matched.size()); matchedIterator = matched.iterator(); assertSame(containers.get(2), matchedIterator.next()); matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(1, matched.size()); matchedIterator = matched.iterator(); assertSame(containers.get(1), matchedIterator.next()); } @Test public void matchWithNonExistentCriteria() { deploymentProperties.setCount(0); deploymentProperties.setCriteria("foo=='bar'"); Collection<Container> matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(0, matched.size()); } @Test public void matchWithInvalidCriteria() { deploymentProperties.setCount(0); deploymentProperties.setCriteria("color"); Collection<Container> matched = containerMatcher.match(moduleDescriptor, deploymentProperties, containers); assertEquals(0, matched.size()); } }