package org.ovirt.engine.ui.uicommonweb.validation; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.anyString; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import java.util.Random; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.ovirt.engine.core.common.validation.MaskValidator; @RunWith(Parameterized.class) public class SubnetMaskValidationTest { @Parameterized.Parameter(0) public String mask; @Parameterized.Parameter(1) public boolean isMaskValid; @Parameterized.Parameter(2) public boolean isPrefixAllowed; private SubnetMaskValidation createUnderTest(boolean isPrefixAllowed) { SubnetMaskValidation underTest = spy(new SubnetMaskValidation(isPrefixAllowed)); doReturn(ErrorMessage.invalidMask.name()).when(underTest).getInvalidMask(); doReturn(ErrorMessage.badNetmaskFormatMessage.name()).when(underTest).getBadNetmaskFormatMessage(); doReturn(ErrorMessage.badPrefixOrNetmaskFormatMessage.name()).when(underTest).getBadPrefixOrNetmaskFormatMessage(); return underTest; } @Test public void checkValidMask() { SubnetMaskValidation underTest = createUnderTest(isPrefixAllowed); assertEquals("Failed to validate mask: " + mask, isMaskValid, underTest.validate(mask).getSuccess());//$NON-NLS-1$ } @Test public void checkValidErrorMessage() { Random random = new Random(); runErrorMessageCheck(random.nextBoolean(), true, false, false, ErrorMessage.invalidMask); runErrorMessageCheck(true, false, random.nextBoolean(), false, ErrorMessage.badPrefixOrNetmaskFormatMessage); runErrorMessageCheck(false, false, random.nextBoolean(), random.nextBoolean(), ErrorMessage.badNetmaskFormatMessage); runErrorMessageCheck(random.nextBoolean(), true, true, false, ErrorMessage.NoError); runErrorMessageCheck(true, false, random.nextBoolean(), true, ErrorMessage.NoError); } private void runErrorMessageCheck(boolean isPrefixAllowed, boolean isNetmaskValidFormat, boolean isNetmaskValidValue, boolean isPrefixValid, ErrorMessage errorType) { MaskValidator validator = mock(MaskValidator.class); doReturn(isPrefixValid).when(validator).isPrefixValid(anyString()); doReturn(isNetmaskValidFormat).when(validator).isValidNetmaskFormat(anyString()); doReturn(isNetmaskValidValue).when(validator).isNetmaskValid(anyString()); SubnetMaskValidation subnetMaskValidationSpy = createUnderTest(isPrefixAllowed); doReturn(validator).when(subnetMaskValidationSpy).getMaskValidator(); ValidationResult actualResult = subnetMaskValidationSpy.validate(anyString()); final String exceptionMessage = String.format("Failed to validate subnet result message: expected: %s\tresult: %s\t for: isPrefixAllowed: %b\tisNetmaskValidFormat: %b\t isMaskValid: %b\t isPrefixValid: %b", //$NON-NLS-1$ errorType.name(), actualResult.getReasons().isEmpty() ? ErrorMessage.NoError : actualResult.getReasons().get(0), isPrefixAllowed, isNetmaskValidFormat, isNetmaskValidValue, isPrefixValid); if (actualResult.getSuccess()) { assertEquals(exceptionMessage, isNetmaskValidValue || isPrefixAllowed && isPrefixValid, actualResult.getReasons().isEmpty());//$NON-NLS-1$ } else { assertEquals(exceptionMessage, errorType.name(), actualResult.getReasons().get(0));//$NON-NLS-1$ } } enum ErrorMessage { NoError, badPrefixOrNetmaskFormatMessage, badNetmaskFormatMessage, invalidMask } @Parameterized.Parameters public static Object[][] namesParams() { return new Object[][] { // Bad Format { null, false, true }, //$NON-NLS-1$ { "", false, true }, //$NON-NLS-1$ { "a.a.a.a", false, true }, //$NON-NLS-1$ { "255.255.0", false, true }, //$NON-NLS-1$ { "255.255.0.0.0", false, true }, //$NON-NLS-1$ { "255.255.0.0.", false, true }, //$NON-NLS-1$ { "31 ", false, true }, //$NON-NLS-1$ /* note extra space */ { "31 ", false, false }, //$NON-NLS-1$ /* note extra space */ { "/31 ", false, true }, //$NON-NLS-1$ /*note extra space*/ { "31/", false, true }, //$NON-NLS-1$ { "31*", false, true }, //$NON-NLS-1$ { "//31 ", false, true }, //$NON-NLS-1$ { "33", false, true }, //$NON-NLS-1$ { "33", false, false }, //$NON-NLS-1$ { "/33", false, true }, //$NON-NLS-1$ { "01", false, true }, //$NON-NLS-1$ { "01/", false, true }, //$NON-NLS-1$ // Not Valid { "255.255.0.1", false, true }, //$NON-NLS-1$ { "255.255.0.1", false, false }, //$NON-NLS-1$ { "255.0.255.0", false, true }, //$NON-NLS-1$ { "224.0.255.0", false, true }, //$NON-NLS-1$ { "255.0.0.255", false, true }, //$NON-NLS-1$ // Valid { "255.255.0.0", true, true }, //$NON-NLS-1$ { "255.255.0.0", true, false }, //$NON-NLS-1$ { "255.255.255.255", true, true }, //$NON-NLS-1$ // prefix supported { "31", true, true }, //$NON-NLS-1$ { "/31", true, true }, //$NON-NLS-1$ { "2", true, true }, //$NON-NLS-1$ { "/2", true, true }, //$NON-NLS-1$ // prefix not supported { "31", false, false }, //$NON-NLS-1$ { "/31", false, false }, //$NON-NLS-1$ { "2", false, false }, //$NON-NLS-1$ { "/2", false, false }, //$NON-NLS-1$ }; } }