def testTelemetryValidatorIgnoresMissingPointOnPartialUpdate(self): validator = telemetry_validator.TelemetryValidator(_ENTITIES_1, 1, _NULL_CALLBACK) validator.ValidateMessage(_MESSAGE_MISSING_POINT_PARTIAL) self.assertEmpty(validator.GetErrors())
def testTelemetryValidatorCallbackWhenAllEntitiesValidated(self): def ValidationCallback(validator): self.assertEmpty(validator.GetErrors()) self.assertTrue(validator.AllEntitiesValidated()) validator = telemetry_validator.TelemetryValidator( _ENTITIES_1, 1, ValidationCallback) validator.ValidateMessage(_MESSAGE_GOOD)
def testTelemetryValidatorOnMultiStateWithStringSuccess(self): def ValidationCallback(validator): self.assertEmpty(validator.GetErrors()) self.assertTrue(validator.AllEntitiesValidated()) validator = telemetry_validator.TelemetryValidator( _ENTITIES_7, 1, ValidationCallback) validator.ValidateMessage(_MESSAGE_STRING_STATES)
def testTelemetryValidatorOnMultiStateWithRawValueList(self): def ValidationCallback(validator): self.assertEmpty(validator.GetErrors()) self.assertTrue(validator.AllEntitiesValidated()) validator = telemetry_validator.TelemetryValidator( _ENTITIES_6, 1, ValidationCallback) validator.ValidateMessage(_MESSAGE_GOOD_STATES_LIST)
def testTelemetryValidatorGetUnvalidatedEntitiesReturnsMissingEntities(self): validator = telemetry_validator.TelemetryValidator(_ENTITIES_3_4, 1, _NULL_CALLBACK) validator.ValidateMessage(_MESSAGE_GOOD_2) unvalidated_entities = validator.GetUnvalidatedEntityNames() self.assertNotIn(_ENTITY_NAME_3, unvalidated_entities) self.assertIn(_ENTITY_NAME_4, unvalidated_entities) self.assertLen(unvalidated_entities, 1)
def testTelemetryValidatorDetectsUnknownEntity(self): validator = telemetry_validator.TelemetryValidator({}, 1, _NULL_CALLBACK) validator.ValidateMessage(_MESSAGE_GOOD) error = telemetry_error.TelemetryError(_ENTITY_NAME_1, None, 'Unknown entity') errors = validator.GetErrors() self.assertIn(error, errors) self.assertEqual(len(errors), 1)
def testTelemetryValidatorDetectsBooleanAsInvalidNumber(self): validator = telemetry_validator.TelemetryValidator( _ENTITIES_1, 1, _NULL_CALLBACK) validator.ValidateMessage(_MESSAGE_INVALID_NUMBER_BOOLEAN) error = telemetry_error.TelemetryError(_ENTITY_NAME_1, _POINT_NAME_1, 'Invalid number: False') errors = validator.GetErrors() self.assertIn(error, errors) self.assertEqual(len(errors), 1)
def testTelemetryValidatorDetectsInvalidState(self): validator = telemetry_validator.TelemetryValidator( _ENTITIES_2, 1, _NULL_CALLBACK) validator.ValidateMessage(_MESSAGE_INVALID_STATE) error = telemetry_error.TelemetryError(_ENTITY_NAME_2, _POINT_NAME_3, 'Invalid state: BAD_STATE') errors = validator.GetErrors() self.assertIn(error, errors) self.assertEqual(len(errors), 1)
def testTelemetryValidatorDetectsMissingPresentValue(self): validator = telemetry_validator.TelemetryValidator( _ENTITIES_1, 1, _NULL_CALLBACK) validator.ValidateMessage(_MESSAGE_MISSING_PRESENT_VALUE) error = telemetry_error.TelemetryError(_ENTITY_NAME_1, _POINT_NAME_1, 'Missing present value') errors = validator.GetErrors() self.assertIn(error, errors) self.assertEqual(len(errors), 1)
def testTelemetryValidatorDetectsMissingPoint(self): validator = telemetry_validator.TelemetryValidator(_ENTITIES_1, 1, _NULL_CALLBACK) validator.ValidateMessage(_MESSAGE_MISSING_POINT) error = telemetry_error.TelemetryError( _ENTITY_NAME_1, _POINT_NAME_2, 'Field missing from ' 'telemetry message') errors = validator.GetErrors() self.assertIn(error, errors) self.assertLen(errors, 1)
def testTelemetryValidatorDetectsNoneValue(self): validator = telemetry_validator.TelemetryValidator(_ENTITIES_1, 1, _NULL_CALLBACK) validator.ValidateMessage(_MESSAGE_INVALID_NUMBER) error = telemetry_error.TelemetryError( _ENTITY_NAME_1, _POINT_NAME_1, 'Missing number in telemetry message' ': None') errors = validator.GetErrors() self.assertIn(error, errors) self.assertEqual(len(errors), 1)
def testTelemetryValidatorDetectsStringAsInvalidNumber(self): validator = telemetry_validator.TelemetryValidator(_ENTITIES_1, 1, _NULL_CALLBACK) validator.ValidateMessage(_MESSAGE_INVALID_NUMBER) error = telemetry_error.TelemetryError( _ENTITY_NAME_1, _POINT_NAME_1, 'Invalid number in telemetry message' ': BAD_NUMBER') errors = validator.GetErrors() self.assertIn(error, errors) self.assertLen(errors, 1)
def testTelemetryValidatorDetectsMissingPresentValue(self): validator = telemetry_validator.TelemetryValidator( _ENTITIES_1, 1, _NullCallback) validator.ValidateMessage(_MESSAGE_MISSING_PRESENT_VALUE) error = telemetry_error.TelemetryError( _ENTITY_NAME_1, _POINT_NAME_1, 'Missing number in telemetry message' ': None') errors = validator.GetErrors() self.assertIn(error, errors) self.assertLen(errors, 1)
def testTelemetryValidatorDetectsBooleanAsInvalidNumber(self): validator = telemetry_validator.TelemetryValidator( _ENTITIES_1, 1, _NullCallback) validator.ValidateMessage(_MESSAGE_INVALID_NUMBER_BOOLEAN) error = telemetry_error.TelemetryError( _ENTITY_NAME_1, _POINT_NAME_1, 'Invalid number in telemetry message' ': false') errors = validator.GetErrors() self.assertIn(error, errors) self.assertLen(errors, 1)
def testTelemetryValidatorDetectsMultipleErrorsInMessage(self): validator = telemetry_validator.TelemetryValidator( _ENTITIES_1, 1, _NULL_CALLBACK) validator.ValidateMessage(_MESSAGE_MULTIPLE_ERRORS) error_one = telemetry_error.TelemetryError( _ENTITY_NAME_1, _POINT_NAME_1, 'Invalid number: BAD_NUMBER') error_two = telemetry_error.TelemetryError(_ENTITY_NAME_1, _POINT_NAME_2, 'Missing point') errors = validator.GetErrors() self.assertIn(error_one, errors) self.assertIn(error_two, errors) self.assertEqual(len(errors), 2)
def Validate(self, entities: Dict[str, entity_instance.EntityInstance], timeout: int) -> None: """Validates telemetry payload received from the subscription. Args: entities: EntityInstance dictionary keyed by entity name timeout: number of seconds to wait for telemetry """ print('Connecting to pubsub subscription: ', self.subscription) sub = subscriber.Subscriber(self.subscription, self.service_account_file) validator = telemetry_validator.TelemetryValidator( entities, timeout, _TelemetryValidationCallback) validator.StartTimer() sub.Listen(validator.ValidateMessage)
def testTelemetryValidatorGetErrorsReturnsAllErrors(self): validator = telemetry_validator.TelemetryValidator(_ENTITIES_1, 1, _NULL_CALLBACK) error_one = telemetry_error.TelemetryError(_ENTITY_NAME_1, _POINT_NAME_1, 'Test error 1') error_two = telemetry_error.TelemetryError(_ENTITY_NAME_2, _POINT_NAME_2, 'Test error 2') validator.AddError(error_one) validator.AddError(error_two) errors = validator.GetErrors() self.assertIn(error_one, errors) self.assertIn(error_two, errors) self.assertLen(errors, 2)
def testTelemetryValidatorDetectsUnmappedState(self): validator = telemetry_validator.TelemetryValidator(_ENTITIES_2, 1, _NULL_CALLBACK) validator.ValidateMessage(_MESSAGE_INVALID_STATE) error1 = telemetry_error.TelemetryError( _ENTITY_NAME_2, _POINT_NAME_3, 'Unmapped state in telemetry message' ': BAD_STATE') error2 = telemetry_error.TelemetryError( _ENTITY_NAME_2, _POINT_NAME_4, 'Unmapped state in telemetry message: 3') errors = validator.GetErrors() self.assertIn(error1, errors) self.assertIn(error2, errors) self.assertLen(errors, 2)
def StartTelemetryValidation(self, subscription, service_account_file, entity_instances): """Validates telemetry payload received from the subscription. Args: subscription: a pubsub subscription. service_account_file: a GCP service account file. entity_instances: EntityInstance dictionary """ if self.pubsub_validation_set: print('Connecting to pubsub subscription: ', subscription) sub = subscriber.Subscriber(subscription, service_account_file) validator = telemetry_validator.TelemetryValidator( entity_instances, self.timeout, self.TelemetryValidationCallback) validator.StartTimer() sub.Listen(validator.ValidateMessage)
def testTelemetryValidatorDetectsInvalidState(self): validator = telemetry_validator.TelemetryValidator(_ENTITIES_2, 1, _NULL_CALLBACK) validator.ValidateMessage(_MESSAGE_INVALID_STATE) error1 = telemetry_error.TelemetryError( _ENTITY_NAME_2, _POINT_NAME_3, 'Missing state in telemetry message' ': None') error2 = telemetry_error.TelemetryError( _ENTITY_NAME_2, _POINT_NAME_4, 'Missing state in telemetry message' ': None') errors = validator.GetErrors() self.assertIn(error1, errors) self.assertIn(error2, errors) self.assertEqual(len(errors), 2)
def testTelemetryValidatorDetectsMultipleErrorsInMessage(self): validator = telemetry_validator.TelemetryValidator( _ENTITIES_1, 1, _NULL_CALLBACK) validator.ValidateMessage(_MESSAGE_MULTIPLE_ERRORS) error_one = telemetry_error.TelemetryError( _ENTITY_NAME_1, _POINT_NAME_1, 'Missing number in telemetry ' 'message: None') error_two = telemetry_error.TelemetryError( _ENTITY_NAME_1, _POINT_NAME_2, 'Field missing from telemetry ' 'message') errors = validator.GetErrors() self.assertIn(error_one, errors) self.assertIn(error_two, errors) self.assertLen(errors, 2)