def _parse_content_encoding(self, message: Message, system_properties) -> str: content_encoding = "" if "content_encoding" in system_properties: content_encoding = system_properties["content_encoding"] if not content_encoding: details = strings.invalid_encoding_none_found() self._add_issue(severity=Severity.warning, details=details) return None if "utf-8" not in content_encoding.lower(): details = strings.invalid_encoding(content_encoding.lower()) self._add_issue(severity=Severity.warning, details=details) return None return content_encoding
def test_parse_message_bad_encoding_should_warn(self): # setup properties = MessageProperties(content_encoding=self.bad_encoding, content_type=self.content_type) message = Message( body=json.dumps(self.payload).encode(self.bad_encoding), properties=properties, annotations={ common_parser.DEVICE_ID_IDENTIFIER: self.device_id.encode() }, ) args = CommonParserArguments() parser = common_parser.CommonParser(message=message, common_parser_args=args) # act parser.parse_message() expected_details = strings.invalid_encoding(self.bad_encoding) _validate_issues(parser, Severity.warning, 1, 1, [expected_details])
def test_central_validate_messages_issues_detected(self): expected_messages = [] (template_id, _) = self._create_device_template() (device_id, _) = self._create_device(instance_of=template_id) credentials = self._get_credentials(device_id) device_client = helpers.dps_connect_device(device_id, credentials) enqueued_time = utility.calculate_millisec_since_unix_epoch_utc( ) - 10000 # Invalid encoding payload = {"Bool": True} msg = Message(data=json.dumps(payload), content_type="application/json") device_client.send_message(msg) expected_messages.append(strings.invalid_encoding("")) # Content type mismatch (e.g. non application/json) payload = {"Bool": True} msg = Message(data=json.dumps(payload), content_encoding="utf-8") device_client.send_message(msg) expected_messages.append( strings.content_type_mismatch("", "application/json")) # Invalid type payload = {"Bool": 123} msg = Message( data=json.dumps(payload), content_encoding="utf-8", content_type="application/json", ) device_client.send_message(msg) expected_messages.append( strings.invalid_primitive_schema_mismatch_template( "Bool", "boolean", 123)) # Telemetry not defined payload = {"NotPresentInTemplate": True} msg = Message( data=json.dumps(payload), content_encoding="utf-8", content_type="application/json", ) device_client.send_message(msg) # this error is harder to build from strings because we have to construct a whole template for it expected_messages.append( "Following capabilities have NOT been defined in the device template '['NotPresentInTemplate']'" ) # Invalid JSON payload = '{"asd":"def}' msg = Message( data=payload, content_encoding="utf-8", content_type="application/json", ) device_client.send_message(msg) expected_messages.append(strings.invalid_json()) # Validate the messages output = self._get_validate_messages_output( device_id, enqueued_time, max_messages=len(expected_messages)) self._delete_device(device_id) self._delete_device_template(template_id) assert output expected_issues = [ "No encoding found. Expected encoding 'utf-8' to be present in message header.", "Content type '' is not supported. Expected Content type is 'application/json'.", "Datatype of telemetry field 'Bool' does not match the datatype boolean.", "Data sent by the device : 123.", "For more information, see: https://aka.ms/iotcentral-payloads", "Following capabilities have NOT been defined in the device template '['NotPresentInTemplate']'", "Invalid JSON format", ] for issue in expected_issues: assert issue in output