/*
* 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.brooklyn.core.location;
import static org.testng.Assert.assertEquals;
import java.util.Iterator;
import org.testng.Assert;
import org.testng.annotations.Test;
import org.apache.brooklyn.api.location.PortRange;
import org.apache.brooklyn.core.location.PortRanges;
import org.apache.brooklyn.util.core.flags.TypeCoercions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
public class PortRangesTest {
@Test
public void testSingleRange() {
PortRange r = PortRanges.fromInteger(1234);
assertContents(r, 1234);
}
@Test
public void testFromIterable() {
PortRange r = PortRanges.fromIterable(ImmutableList.of(1234, 2345));
assertContents(r, 1234, 2345);
}
@Test
public void testFromString() {
PortRange r = PortRanges.fromString("80,8080,8000,8080-8099");
assertContents(r, 80, 8080, 8000,
8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089,
8090, 8091, 8092, 8093, 8094, 8095, 8096, 8097, 8098, 8099);
}
@Test
public void testFromStringWithSpaces() {
PortRange r = PortRanges.fromString(" 80 , 8080 , 8000 , 8080 - 8099 ");
assertContents(r, 80, 8080, 8000,
8080, 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089,
8090, 8091, 8092, 8093, 8094, 8095, 8096, 8097, 8098, 8099);
}
@Test
public void testFromStringWithSpacesToString() {
PortRange r = PortRanges.fromString(" 80 , 8080 , 8000 , 8080 - 8099 ");
Assert.assertEquals(r.toString(), "80,8080,8000,8080-8099");
}
@Test
public void testFromStringThrowsIllegalArgumentException() {
assertFromStringThrowsIllegalArgumentException("80-100000");
assertFromStringThrowsIllegalArgumentException("0-80");
}
@Test
public void testCoercion() {
PortRanges.init();
PortRange r = TypeCoercions.coerce("80", PortRange.class);
assertContents(r, 80);
}
@Test
public void testCoercionInt() {
PortRanges.init();
PortRange r = TypeCoercions.coerce(80, PortRange.class);
assertContents(r, 80);
}
@Test
public void testLinearRangeOfSizeOne() throws Exception {
PortRanges.LinearPortRange range = new PortRanges.LinearPortRange(80, 80);
assertEquals(Lists.newArrayList(range), ImmutableList.of(80));
}
@Test
public void testLinearRangeCountingUpwards() throws Exception {
PortRanges.LinearPortRange range = new PortRanges.LinearPortRange(80, 81);
assertEquals(Lists.newArrayList(range), ImmutableList.of(80, 81));
}
@Test
public void testLinearRangeCountingDownwards() throws Exception {
PortRanges.LinearPortRange range = new PortRanges.LinearPortRange(80, 79);
assertEquals(Lists.newArrayList(range), ImmutableList.of(80, 79));
}
protected void assertFromStringThrowsIllegalArgumentException(String range) {
try {
PortRanges.fromString(range);
Assert.fail();
} catch (IllegalArgumentException e) {
// success
}
}
private static <T> void assertContents(Iterable<T> actual, T ...expected) {
Iterator<T> i = actual.iterator();
int c = 0;
while (i.hasNext()) {
if (expected.length<=c) {
Assert.fail("Iterable contained more than the "+c+" expected elements");
}
Assert.assertEquals(i.next(), expected[c++]);
}
if (expected.length>c) {
Assert.fail("Iterable contained only "+c+" elements, "+expected.length+" expected");
}
}
}