private ValidationResult build( ValidationResultType type, String name, Throwable ex, String message, Map<String, String> details) { reset(); return new ValidationResult(type, name, ex, message, details); }
/** * Initiates the building of a result from a validation listener. * The {@link ValidationResult#getName name} of the validation result with be * set to the {@link ValidatorListener#getName name} of the validator * * @param v the validation listener * @return the validation builder * @throws NullPointerException if {@code v} is {@code null} */ public static ValidationResultBuilder from(ValidatorListener v) { return from(v.getName()); }
/** * Initiates the building of a result from a name. * * @param name the validation result * @return the validation builder * @throws NullPointerException if {@code name} is {@code null} */ public static ValidationResultBuilder from(String name) { return new ValidationResultBuilder(name); }
@Test public void testValidationListenerWithOnlyRecordCountValidator() { createHollowProducerAndRunCycle("MovieWithPrimaryKey", false); assertOnValidationStatus(1, true); // Expecting only record count validator status ValidationResult validatorStatus = validationListener.getStatus().getResults().get(0); Assert.assertNotNull(validatorStatus); // ValidationStatus builds record validator status based toString of RecordCountValidatorStatus for now. Assert.assertEquals(ValidationResultType.PASSED, validatorStatus.getResultType()); Assert.assertNull(validatorStatus.getThrowable()); // Record count validator would have skipped validation because the previous record count is 0 in this test. // But that status for now is only passed as string through toString method of the validator. Assert.assertTrue(validatorStatus.getMessage().contains("MovieWithPrimaryKey")); Assert.assertTrue(validatorStatus.getMessage().contains("Previous record count is 0")); // Check details Assert.assertTrue(validatorStatus.getName().startsWith(RecordCountVarianceValidator.class.getName())); Assert.assertEquals("MovieWithPrimaryKey", validatorStatus.getDetails().get("Typename")); Assert.assertEquals("3.0", validatorStatus.getDetails().get("AllowableVariancePercent")); }
private void validate(ListenerSupport.Listeners listeners, HollowProducer.ReadState readState) { Status.StageWithStateBuilder psb = listeners.fireValidationStart(readState); ValidationStatus status = null; try { // Stream over the concatenation of the old and new validators List<ValidationResult> results = listeners.getListeners(ValidatorListener.class) .map(v -> { try { return v.onValidate(readState); } catch (RuntimeException e) { return ValidationResult.from(v).error(e); } }) .collect(toList()); status = new ValidationStatus(results); if (!status.passed()) { ValidationStatusException e = new ValidationStatusException( status, "One or more validations failed. Please check individual failures."); psb.fail(e); throw e; } psb.success(); } finally { listeners.fireValidationComplete(psb, status); } }
private void createHollowProducerAndRunCycle(final String typeName, boolean addPrimaryKeyValidator) { ValidatorListener dupeValidator = new DuplicateDataDetectionValidator(typeName); ValidatorListener countValidator = new RecordCountVarianceValidator(typeName, 3.0f); validationListener = new TestValidationStatusListener(); cycleAndValidationListener = new TestCycleAndValidationStatusListener(); Builder builder = HollowProducer.withPublisher(publisher).withAnnouncer(announcer) .withListener(validationListener) .withListener(cycleAndValidationListener) .withListener(countValidator); if (addPrimaryKeyValidator) { builder = builder.withListener(dupeValidator); } HollowProducer hollowProducer = builder.build(); if (typeName.equals("MovieWithPrimaryKey")) { hollowProducer.initializeDataModel(MovieWithPrimaryKey.class); } else { hollowProducer.initializeDataModel(MovieWithoutPrimaryKey.class); } hollowProducer.runCycle(newState -> { List<String> actors = Arrays.asList("Angelina Jolie", "Brad Pitt"); if (typeName.equals("MovieWithPrimaryKey")) { newState.add(new MovieWithPrimaryKey(123, "someTitle1", actors)); newState.add(new MovieWithPrimaryKey(123, "someTitle1", actors)); } else { newState.add(new MovieWithoutPrimaryKey(123, "someTitle1", actors)); newState.add(new MovieWithoutPrimaryKey(1233, "someTitle2", actors)); } }); }
@Test public void testValidationListenerOnValidationSuccess() { createHollowProducerAndRunCycle("MovieWithPrimaryKey", true); assertOnValidationStatus(2, true); Assert.assertTrue(validationListener.getVersion() > 0); Assert.assertTrue(cycleAndValidationListener.getVersion() > 0); Assert.assertEquals(cycleAndValidationListener.getCycleVersion(), cycleAndValidationListener.getVersion()); Assert.assertEquals(cycleAndValidationListener.getCycleVersion(), validationListener.getVersion()); }
private void assertOnValidationStatus(int size, boolean passed) { ValidationStatus status = validationListener.getStatus(); Assert.assertNotNull( "Stats null indicates HollowValidationFakeListener.onValidationComplete() was not called on runCycle.", status); Assert.assertEquals(size, status.getResults().size()); Assert.assertEquals(passed, status.passed()); }
@Test public void duplicateDetectionFailureTest() { duplicateDetectionFailureTest(new DuplicateDataDetectionValidator("TypeWithPrimaryKey")); duplicateDetectionFailureTest( new DuplicateDataDetectionValidator("TypeWithPrimaryKey", new String[] {"id", "name"})); duplicateDetectionFailureTest(new DuplicateDataDetectionValidator(TypeWithPrimaryKey.class)); duplicateDetectionFailureTest(new DuplicateDataDetectionValidator(TypeWithPrimaryKey2.class)); duplicateDetectionFailureTest(null, true); duplicateDetectionFailureTest(new DuplicateDataDetectionValidator(TypeWithPrimaryKey.class), true); }
public void populate(WriteState newState) throws Exception { newState.add(new TypeWithPrimaryKey(1, "Brad Pitt", "klsdjfla;sdjkf")); newState.add(new TypeWithPrimaryKey(2, "Angelina Jolie", "as;dlkfjasd;l")); newState.add(new TypeWithPrimaryKey(3, "Angelina Jolie1", "as;dlkfjasd;l")); newState.add(new TypeWithPrimaryKey(4, "Angelina Jolie2", "as;dlkfjasd;l")); newState.add(new TypeWithPrimaryKey(5, "Angelina Jolie3", "as;dlkfjasd;l")); newState.add(new TypeWithPrimaryKey(6, "Angelina Jolie4", "as;dlkfjasd;l")); newState.add(new TypeWithPrimaryKey(7, "Angelina Jolie5", "as;dlkfjasd;l")); } });
@Test(expected = ValidationStatusException.class) public void testValidationListenerOnFailure() { createHollowProducerAndRunCycle("MovieWithoutPrimaryKey", true); assertOnValidationStatus(2, false); }
/** * Builds a result that has {@link ValidationResultType#PASSED passed} with a message. * * @param message the message, may be {@code null} * @return a validation result that has passed. */ public ValidationResult passed(String message) { return build( ValidationResultType.PASSED, name, null, message, details ); }
/** * Builds a result that has {@link ValidationResultType#PASSED passed} with no message. * * @return a validation result that has passed. */ public ValidationResult passed() { return new ValidationResult( ValidationResultType.PASSED, name, null, null, details ); }
void duplicateDetectionFailureTest(DuplicateDataDetectionValidator v) { duplicateDetectionFailureTest(v, false); }
public void populate(WriteState newState) throws Exception { newState.add(new TypeWithPrimaryKey(1, "Brad Pitt", "klsdjfla;sdjkf")); newState.add(new TypeWithPrimaryKey(1, "Angelina Jolie", "as;dlkfjasd;l")); } });
/** * Builds a result that has {@link ValidationResultType#FAILED failed} with a message. * * @param message the message * @return a validation result that has failed. * @throws NullPointerException if {@code message} is {@code null} */ public ValidationResult failed(String message) { return build( ValidationResultType.FAILED, name, null, message, details ); }
public void populate(WriteState newState) throws Exception { newState.add(new TypeWithPrimaryKey(1, "Brad Pitt", "klsdjfla;sdjkf")); newState.add(new TypeWithPrimaryKey(1, "Angelina Jolie", "as;dlkfjasd;l")); } });
public void populate(WriteState newState) throws Exception { newState.add(new TypeWithPrimaryKey(1, "Brad Pitt", "klsdjfla;sdjkf")); newState.add(new TypeWithPrimaryKey(1, "Angelina Jolie", "as;dlkfjasd;l")); newState.add(new TypeWithPrimaryKey(1, "Bruce Willis", "as;dlkfjasd;l")); } });
public void populate(WriteState newState) throws Exception { newState.add(new TypeWithPrimaryKey(1, "Brad Pitt", "klsdjfla;sdjkf")); newState.add(new TypeWithPrimaryKey(1, "Angelina Jolie", "as;dlkfjasd;l")); } });
public void populate(WriteState newState) throws Exception { newState.add(new TypeWithPrimaryKey(1, "Brad Pitt", "klsdjfla;sdjkf")); newState.add(new TypeWithPrimaryKey(2, "Angelina Jolie", "as;dlkfjasd;l")); newState.add(new TypeWithPrimaryKey(7, "Bruce Willis", "as;dlkfjasd;l")); } });