package org.openstack.atlas.api.validation.validators;
import org.junit.Before;
import org.junit.Test;
import org.openstack.atlas.api.validation.context.NetworkItemContext;
import org.openstack.atlas.api.validation.results.ExpectationResult;
import org.openstack.atlas.api.validation.results.ValidatorResult;
import org.openstack.atlas.docs.loadbalancers.api.v1.NetworkItem;
import org.openstack.atlas.docs.loadbalancers.api.v1.NetworkItemType;
import java.util.List;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.openstack.atlas.api.validation.context.NetworkItemContext.FULL;
import static org.openstack.atlas.api.validation.context.NetworkItemContext.PARTIAL;
public class NetworkItemValidatorTest {
private NetworkItemValidator nwValidator;
private NetworkItem nwTest;
@Before
public void setupValidNetworkItemObject() {
nwValidator = new NetworkItemValidator();
nwTest = new NetworkItem();
nwTest.setAddress("69.172.35.111");
nwTest.setType(NetworkItemType.ALLOW);
}
public static NetworkItem initNetworkItem(String ip, String networkitemtype, String id) {
NetworkItem networkitem = new NetworkItem();
networkitem.setAddress(ip);
networkitem.setType((networkitemtype == null) ? null : NetworkItemType.valueOf(networkitemtype));
networkitem.setId((id == null) ? null : Integer.parseInt(id));
return networkitem;
}
@Test
public void shouldRejectInvalidIpForZeus() {
NetworkItem nwTest1 = new NetworkItem();
nwTest1.setAddress("0.0.0.0");
ValidatorResult result = nwValidator.validate(nwTest1, FULL);
assertFalse(result.passedValidation());
}
@Test
public void shouldAcceptValidNetworkItem() {
ValidatorResult result = nwValidator.validate(nwTest, FULL);
assertTrue(resultMessage(result, FULL), result.passedValidation());
result = setPartialContextAndFetchPutResults(nwTest);
assertTrue(resultMessage(result, PARTIAL), result.passedValidation());
}
@Test
public void shouldRejectNullIp() {
nwTest = initNetworkItem(null, "DENY", null);
ValidatorResult result = nwValidator.validate(nwTest, FULL);
assertFalse(resultMessage(result, FULL), result.passedValidation());
}
@Test
public void shouldRejectNullType() {
nwTest = initNetworkItem("69.172.35.111", null, null);
ValidatorResult result = nwValidator.validate(nwTest, FULL);
assertFalse(resultMessage(result, FULL), result.passedValidation());
}
@Test
public void shouldRejectId() {
nwTest.setId(1);
ValidatorResult result = nwValidator.validate(nwTest, FULL);
assertFalse(resultMessage(result, NetworkItemContext.FULL), result.passedValidation());
result = setPartialContextAndFetchPutResults(nwTest);
assertFalse(resultMessage(result, PARTIAL), result.passedValidation()); // Should Reject ID during Partial as well
}
@Test
public void shouldAcceptHexdigitslessthan4() {
nwTest = initNetworkItem("1:2:3:4:5:6:7:8", "ALLOW", null);
ValidatorResult result = nwValidator.validate(nwTest, FULL);
assertTrue(resultMessage(result, FULL), result.passedValidation());
result = setPartialContextAndFetchPutResults(nwTest);
assertTrue(resultMessage(result, PARTIAL), result.passedValidation());
}
@Test
public void shouldAcceptSingleAttributesInPut() { // Except ip addres and version should be in pairs
nwTest = initNetworkItem("192.168.3.51", null, null);
ValidatorResult result = nwValidator.validate(nwTest, PARTIAL);
assertTrue(resultMessage(result, PARTIAL), result.passedValidation());
nwTest = initNetworkItem(null, "ALLOW", null);
result = nwValidator.validate(nwTest, NetworkItemContext.PARTIAL);
assertTrue(resultMessage(result, PARTIAL), result.passedValidation());
}
//@Test
public void ShouldAcceptIPv4Subnets() {
int i;
String ip;
for (i = -65536; i <= 6536; i++) {
ip = String.format("192.168.3.51/%d", i);
nwTest = initNetworkItem(ip, "ALLOW", null);
ValidatorResult result = nwValidator.validate(nwTest, FULL);
if (i >= 0 && i <= 32) {
assertTrue(String.format("Expected acceptance of %s", ip), result.passedValidation());
} else {
assertFalse(String.format("Expected rejection of %s", ip), result.passedValidation());
}
}
}
@Test
public void shouldRejectNegIntIdOnPut() {
nwTest = initNetworkItem("192.168.3.1", "ALLOW", "-1");
ValidatorResult result = nwValidator.validate(nwTest, PARTIAL);
assertFalse(resultMessage(result, PARTIAL), result.passedValidation());
}
@Test
public void shouldReject1billionorMoreForIdOnPut() {
nwTest = initNetworkItem("192.168.3.1", "ALLOW", "1000000000");
ValidatorResult result = nwValidator.validate(nwTest, PARTIAL);
assertFalse(resultMessage(result, PARTIAL), result.passedValidation());
}
@Test
public void shouldAcceptIfNoIdPresentOnPut() {
nwTest = initNetworkItem("192.168.3.51", "ALLOW", null);
ValidatorResult result = nwValidator.validate(nwTest, PARTIAL);
assertTrue(resultMessage(result, PARTIAL), result.passedValidation());
}
@Test
public void shouldRejectNetworkItemifAllAttributesAreMissingOnPut() {
nwTest = initNetworkItem(null, null, null);
ValidatorResult result = nwValidator.validate(nwTest, FULL);
assertFalse(resultMessage(result, PARTIAL), result.passedValidation());
}
public ValidatorResult setPartialContextAndFetchPutResults(NetworkItem nwTest) {
NetworkItemValidator nwv = new NetworkItemValidator();
ValidatorResult result;
//nwTest.setId(100);
result = nwv.validate(nwTest, PARTIAL);
return result;
}
public String resultMessage(ValidatorResult result, Enum ctx) {
StringBuilder sb = new StringBuilder();
if (!result.passedValidation()) {
List<ExpectationResult> ers = result.getValidationResults();
sb.append(String.format("ON %s result.withMessage([", ctx.toString()));
for (ExpectationResult er : ers) {
sb.append(String.format("%s", er.getMessage()));
sb.append("])");
}
} else {
sb.append(String.format("On %s All Expectations PASSED\n", ctx.toString()));
}
return sb.toString();
}
@Test
public void shouldRejectTooFewOctetsIPv4() {
nwTest = initNetworkItem("200.200.200", "ALLOW", null);
ValidatorResult result = nwValidator.validate(nwTest, FULL);
assertFalse(resultMessage(result, FULL), result.passedValidation());
result = setPartialContextAndFetchPutResults(nwTest);
assertFalse(resultMessage(result, PARTIAL), result.passedValidation());
}
@Test
public void shouldRejectTooManyOctetsIPv4() {
nwTest = initNetworkItem("200.200.200.200.200", "ALLOW", null);
ValidatorResult result = nwValidator.validate(nwTest, FULL);
assertFalse(resultMessage(result, FULL), result.passedValidation());
result = setPartialContextAndFetchPutResults(nwTest);
assertFalse(resultMessage(result, PARTIAL), result.passedValidation());
}
@Test
public void shouldRejectOctetOutofRangeIPv4() {
nwTest = initNetworkItem("266.0.0.0", "ALLOW", null);
ValidatorResult result = nwValidator.validate(nwTest, FULL);
assertFalse(resultMessage(result, NetworkItemContext.FULL), result.passedValidation());
result = setPartialContextAndFetchPutResults(nwTest);
assertFalse(resultMessage(result, PARTIAL), result.passedValidation());
}
@Test
public void shouldRejectHostNamesIpv4() {
nwTest = initNetworkItem("www.google.com", "ALLOW", null);
ValidatorResult result = nwValidator.validate(nwTest, FULL);
assertFalse(resultMessage(result, FULL), result.passedValidation());
result = setPartialContextAndFetchPutResults(nwTest);
assertFalse(resultMessage(result, PARTIAL), result.passedValidation());
}
@Test
public void shouldRejectEmptyIpStrings() {
nwTest = initNetworkItem("", "ALLOW", null);
ValidatorResult result = nwValidator.validate(nwTest, FULL);
assertFalse(resultMessage(result, FULL), result.passedValidation());
result = setPartialContextAndFetchPutResults(nwTest);
assertFalse(resultMessage(result, PARTIAL), result.passedValidation());
}
}