def _ParseDateTimeValue(self, byte_stream, file_offset): """Parses a CUPS IPP RFC2579 date-time value from a byte stream. Args: byte_stream (bytes): byte stream. file_offset (int): offset of the attribute data relative to the start of the file-like object. Returns: dfdatetime.RFC2579DateTime: RFC2579 date-time stored in the value. Raises: ParseError: when the RFC2579 date-time value cannot be parsed. """ datetime_value_map = self._GetDataTypeMap('cups_ipp_datetime_value') try: value = self._ReadStructureFromByteStream( byte_stream, file_offset, datetime_value_map) except (ValueError, errors.ParseError) as exception: raise errors.ParseError( 'Unable to parse datetime value with error: {0!s}'.format(exception)) direction_from_utc = chr(value.direction_from_utc) rfc2579_date_time_tuple = ( value.year, value.month, value.day_of_month, value.hours, value.minutes, value.seconds, value.deciseconds, direction_from_utc, value.hours_from_utc, value.minutes_from_utc) return dfdatetime_rfc2579_date_time.RFC2579DateTime( rfc2579_date_time_tuple=rfc2579_date_time_tuple)
def testCopyToDateTimeStringISO8601(self): """Tests the CopyToDateTimeStringISO8601 function.""" rfc2579_date_time_object = rfc2579_date_time.RFC2579DateTime( rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31, 6, '+', 0, 0)) date_time_string = rfc2579_date_time_object.CopyToDateTimeStringISO8601( ) self.assertEqual(date_time_string, '2010-08-12T20:06:31.6+00:00')
def testGetNormalizedTimestamp(self): """Tests the _GetNormalizedTimestamp function.""" rfc2579_date_time_object = rfc2579_date_time.RFC2579DateTime( rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31, 6, '+', 0, 0)) normalized_timestamp = rfc2579_date_time_object._GetNormalizedTimestamp( ) self.assertEqual(normalized_timestamp, decimal.Decimal('1281643591.6')) rfc2579_date_time_object = rfc2579_date_time.RFC2579DateTime( rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31, 6, '+', 1, 0)) normalized_timestamp = rfc2579_date_time_object._GetNormalizedTimestamp( ) self.assertEqual(normalized_timestamp, decimal.Decimal('1281639991.6')) rfc2579_date_time_object = rfc2579_date_time.RFC2579DateTime() normalized_timestamp = rfc2579_date_time_object._GetNormalizedTimestamp( ) self.assertIsNone(normalized_timestamp)
def _ReadPair(self, parser_mediator, file_object): """Reads an attribute name and value pair from a CUPS IPP event. Args: parser_mediator (ParserMediator): mediates interactions between parsers and other components, such as storage and dfvfs. file_object (dfvfs.FileIO): file-like object. Returns: tuple: contains: str: name or None. str: value or None. """ # Pair = Type ID + Name + Value. try: # Can be: # Group ID + IDtag = Group ID (1byte) + Tag ID (1byte) + '0x00'. # IDtag = Tag ID (1byte) + '0x00'. type_id = self.INTEGER_8.parse_stream(file_object) if type_id == self.GROUP_END: return None, None elif type_id in self.GROUP_LIST: # If it is a group ID we must read the next byte that contains # the first TagID. type_id = self.INTEGER_8.parse_stream(file_object) # 0x00 separator character. self.INTEGER_8.parse_stream(file_object) except (IOError, construct.FieldError) as exception: parser_mediator.ProduceExtractionError( 'unable to parse pair identifier with error: {0!s}'.format( exception)) return None, None # Name = Length name + name + 0x00 try: pair_name = self.PAIR_NAME.parse_stream(file_object) except (IOError, construct.FieldError) as exception: parser_mediator.ProduceExtractionError( 'unable to parse pair name with error: {0!s}'.format( exception)) return None, None try: name = pair_name.text.decode('utf-8') except UnicodeDecodeError as exception: parser_mediator.ProduceExtractionError( 'unable to decode pair name with error: {0!s}'.format( exception)) return None, None # Value: can be integer, boolean or text select by Type ID. if type_id in (self.TYPE_GENERAL_INTEGER, self.TYPE_INTEGER, self.TYPE_ENUMERATION): value_structure = self.INTEGER elif type_id == self.TYPE_BOOL: value_structure = self.BOOLEAN elif type_id == self.TYPE_DATETIME: value_structure = self.DATETIME else: value_structure = self.TEXT try: value = value_structure.parse_stream(file_object) except (IOError, construct.FieldError) as exception: parser_mediator.ProduceExtractionError( 'unable to parse value with error: {0!s}'.format(exception)) return None, None if type_id in (self.TYPE_GENERAL_INTEGER, self.TYPE_INTEGER, self.TYPE_ENUMERATION): value = value.integer elif type_id == self.TYPE_BOOL: value = bool(value.integer) elif type_id == self.TYPE_DATETIME: rfc2579_date_time_tuple = (value.year, value.month, value.day, value.hour, value.minutes, value.seconds, value.deciseconds, value.direction_from_utc, value.hours_from_utc, value.minutes_from_utc) value = dfdatetime_rfc2579_date_time.RFC2579DateTime( rfc2579_date_time_tuple=rfc2579_date_time_tuple) else: try: value = value.decode('utf-8') except UnicodeDecodeError as exception: parser_mediator.ProduceExtractionError( 'unable to decode value with error: {0!s}'.format( exception)) return None, None return name, value
def testInitialize(self): """Tests the initialization function.""" rfc2579_date_time_object = rfc2579_date_time.RFC2579DateTime() self.assertIsNotNone(rfc2579_date_time_object) rfc2579_date_time_object = rfc2579_date_time.RFC2579DateTime( rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31, 6, '+', 2, 0)) self.assertIsNotNone(rfc2579_date_time_object) self.assertEqual(rfc2579_date_time_object.year, 2010) self.assertEqual(rfc2579_date_time_object.month, 8) self.assertEqual(rfc2579_date_time_object.day_of_month, 12) self.assertEqual(rfc2579_date_time_object.hours, 20) self.assertEqual(rfc2579_date_time_object.minutes, 6) self.assertEqual(rfc2579_date_time_object.seconds, 31) self.assertEqual(rfc2579_date_time_object.deciseconds, 6) self.assertEqual(rfc2579_date_time_object.time_zone_offset, 120) with self.assertRaises(ValueError): rfc2579_date_time.RFC2579DateTime(rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31)) with self.assertRaises(ValueError): rfc2579_date_time.RFC2579DateTime( rfc2579_date_time_tuple=(65537, 8, 12, 20, 6, 31, 6, '+', 2, 0)) with self.assertRaises(ValueError): rfc2579_date_time.RFC2579DateTime( rfc2579_date_time_tuple=(2010, 13, 12, 20, 6, 31, 6, '+', 2, 0)) with self.assertRaises(ValueError): rfc2579_date_time.RFC2579DateTime( rfc2579_date_time_tuple=(2010, 8, 32, 20, 6, 31, 6, '+', 2, 0)) with self.assertRaises(ValueError): rfc2579_date_time.RFC2579DateTime( rfc2579_date_time_tuple=(2010, 8, 12, 24, 6, 31, 6, '+', 2, 0)) with self.assertRaises(ValueError): rfc2579_date_time.RFC2579DateTime( rfc2579_date_time_tuple=(2010, 8, 12, 20, 61, 31, 6, '+', 2, 0)) with self.assertRaises(ValueError): rfc2579_date_time.RFC2579DateTime( rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 61, 6, '+', 2, 0)) with self.assertRaises(ValueError): rfc2579_date_time.RFC2579DateTime( rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31, 11, '+', 2, 0)) with self.assertRaises(ValueError): rfc2579_date_time.RFC2579DateTime( rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31, 6, '#', 2, 0)) with self.assertRaises(ValueError): rfc2579_date_time.RFC2579DateTime( rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31, 6, '+', 14, 0)) with self.assertRaises(ValueError): rfc2579_date_time.RFC2579DateTime( rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31, 6, '+', 2, 60))
def testCopyFromDateTimeString(self): """Tests the CopyFromDateTimeString function.""" rfc2579_date_time_object = rfc2579_date_time.RFC2579DateTime() rfc2579_date_time_object.CopyFromDateTimeString('2010-08-12') self.assertEqual(rfc2579_date_time_object._number_of_seconds, 1281571200) self.assertEqual(rfc2579_date_time_object._time_zone_offset, 0) self.assertEqual(rfc2579_date_time_object.year, 2010) self.assertEqual(rfc2579_date_time_object.month, 8) self.assertEqual(rfc2579_date_time_object.day_of_month, 12) self.assertEqual(rfc2579_date_time_object.hours, 0) self.assertEqual(rfc2579_date_time_object.minutes, 0) self.assertEqual(rfc2579_date_time_object.seconds, 0) self.assertEqual(rfc2579_date_time_object.deciseconds, 0) rfc2579_date_time_object.CopyFromDateTimeString('2010-08-12 21:06:31') self.assertEqual(rfc2579_date_time_object._number_of_seconds, 1281647191) self.assertEqual(rfc2579_date_time_object._time_zone_offset, 0) self.assertEqual(rfc2579_date_time_object.year, 2010) self.assertEqual(rfc2579_date_time_object.month, 8) self.assertEqual(rfc2579_date_time_object.day_of_month, 12) self.assertEqual(rfc2579_date_time_object.hours, 21) self.assertEqual(rfc2579_date_time_object.minutes, 6) self.assertEqual(rfc2579_date_time_object.seconds, 31) self.assertEqual(rfc2579_date_time_object.deciseconds, 0) rfc2579_date_time_object.CopyFromDateTimeString( '2010-08-12 21:06:31.546875') self.assertEqual(rfc2579_date_time_object._number_of_seconds, 1281647191) self.assertEqual(rfc2579_date_time_object._time_zone_offset, 0) self.assertEqual(rfc2579_date_time_object.year, 2010) self.assertEqual(rfc2579_date_time_object.month, 8) self.assertEqual(rfc2579_date_time_object.day_of_month, 12) self.assertEqual(rfc2579_date_time_object.hours, 21) self.assertEqual(rfc2579_date_time_object.minutes, 6) self.assertEqual(rfc2579_date_time_object.seconds, 31) self.assertEqual(rfc2579_date_time_object.deciseconds, 5) rfc2579_date_time_object.CopyFromDateTimeString( '2010-08-12 21:06:31.546875-01:00') self.assertEqual(rfc2579_date_time_object._number_of_seconds, 1281647191) self.assertEqual(rfc2579_date_time_object._time_zone_offset, -60) self.assertEqual(rfc2579_date_time_object.year, 2010) self.assertEqual(rfc2579_date_time_object.month, 8) self.assertEqual(rfc2579_date_time_object.day_of_month, 12) self.assertEqual(rfc2579_date_time_object.hours, 21) self.assertEqual(rfc2579_date_time_object.minutes, 6) self.assertEqual(rfc2579_date_time_object.seconds, 31) self.assertEqual(rfc2579_date_time_object.deciseconds, 5) self.assertEqual(rfc2579_date_time_object.time_zone_offset, -60) rfc2579_date_time_object.CopyFromDateTimeString( '2010-08-12 21:06:31.546875+01:00') self.assertEqual(rfc2579_date_time_object._number_of_seconds, 1281647191) self.assertEqual(rfc2579_date_time_object._time_zone_offset, 60) self.assertEqual(rfc2579_date_time_object.year, 2010) self.assertEqual(rfc2579_date_time_object.month, 8) self.assertEqual(rfc2579_date_time_object.day_of_month, 12) self.assertEqual(rfc2579_date_time_object.hours, 21) self.assertEqual(rfc2579_date_time_object.minutes, 6) self.assertEqual(rfc2579_date_time_object.seconds, 31) self.assertEqual(rfc2579_date_time_object.deciseconds, 5) self.assertEqual(rfc2579_date_time_object.time_zone_offset, 60) rfc2579_date_time_object.CopyFromDateTimeString('1601-01-02 00:00:00') self.assertEqual(rfc2579_date_time_object._number_of_seconds, -11644387200) self.assertEqual(rfc2579_date_time_object._time_zone_offset, 0) self.assertEqual(rfc2579_date_time_object.year, 1601) self.assertEqual(rfc2579_date_time_object.month, 1) self.assertEqual(rfc2579_date_time_object.day_of_month, 2) self.assertEqual(rfc2579_date_time_object.hours, 0) self.assertEqual(rfc2579_date_time_object.minutes, 0) self.assertEqual(rfc2579_date_time_object.seconds, 0) self.assertEqual(rfc2579_date_time_object.deciseconds, 0) rfc2579_date_time_object = RFC2579DateTimeInvalidYear() with self.assertRaises(ValueError): rfc2579_date_time_object.CopyFromDateTimeString( '9999-01-02 00:00:00')
def testConvertDateTimeValuesToJSON(self): """Test ConvertDateTimeValuesToJSON function.""" posix_time_object = posix_time.PosixTime(timestamp=1281643591) expected_json_dict = { '__class_name__': 'PosixTime', '__type__': 'DateTimeValues', 'timestamp': 1281643591 } json_dict = serializer.Serializer.ConvertDateTimeValuesToJSON( posix_time_object) self.assertEqual(json_dict, expected_json_dict) posix_time_object.is_local_time = True expected_json_dict = { '__class_name__': 'PosixTime', '__type__': 'DateTimeValues', 'is_local_time': True, 'timestamp': 1281643591 } json_dict = serializer.Serializer.ConvertDateTimeValuesToJSON( posix_time_object) self.assertEqual(json_dict, expected_json_dict) never_time_object = semantic_time.Never() expected_json_dict = { '__class_name__': 'Never', '__type__': 'DateTimeValues', 'string': 'Never' } json_dict = serializer.Serializer.ConvertDateTimeValuesToJSON( never_time_object) self.assertEqual(json_dict, expected_json_dict) fat_date_time_object = fat_date_time.FATDateTime( fat_date_time=0xa8d03d0c) expected_json_dict = { '__class_name__': 'FATDateTime', '__type__': 'DateTimeValues', 'fat_date_time': 2832219404 } json_dict = serializer.Serializer.ConvertDateTimeValuesToJSON( fat_date_time_object) self.assertEqual(json_dict, expected_json_dict) golang_timestamp = bytes.fromhex('01000000000000000200000003ffff') golang_time_object = golang_time.GolangTime( golang_timestamp=golang_timestamp) expected_json_dict = { '__class_name__': 'GolangTime', '__type__': 'DateTimeValues', 'golang_timestamp': (b'\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\xff\xff'), 'time_zone_offset': 0 } json_dict = serializer.Serializer.ConvertDateTimeValuesToJSON( golang_time_object) self.assertEqual(json_dict, expected_json_dict) rfc2579_date_time_object = rfc2579_date_time.RFC2579DateTime( rfc2579_date_time_tuple=(2010, 8, 12, 20, 6, 31, 6, '+', 2, 0)) expected_json_dict = { '__class_name__': 'RFC2579DateTime', '__type__': 'DateTimeValues', 'rfc2579_date_time_tuple': (2010, 8, 12, 20, 6, 31, 6), 'time_zone_offset': 120 } json_dict = serializer.Serializer.ConvertDateTimeValuesToJSON( rfc2579_date_time_object) self.assertEqual(json_dict, expected_json_dict) time_elements_object = time_elements.TimeElements( time_elements_tuple=(2010, 8, 12, 20, 6, 31)) expected_json_dict = { '__class_name__': 'TimeElements', '__type__': 'DateTimeValues', 'time_elements_tuple': (2010, 8, 12, 20, 6, 31) } json_dict = serializer.Serializer.ConvertDateTimeValuesToJSON( time_elements_object) self.assertEqual(json_dict, expected_json_dict) time_elements_object = time_elements.TimeElementsInMilliseconds( time_elements_tuple=(2010, 8, 12, 20, 6, 31, 546)) expected_json_dict = { '__class_name__': 'TimeElementsInMilliseconds', '__type__': 'DateTimeValues', 'time_elements_tuple': (2010, 8, 12, 20, 6, 31, 546) } json_dict = serializer.Serializer.ConvertDateTimeValuesToJSON( time_elements_object) self.assertEqual(json_dict, expected_json_dict) time_elements_object = time_elements.TimeElementsInMicroseconds( time_elements_tuple=(2010, 8, 12, 20, 6, 31, 429876)) expected_json_dict = { '__class_name__': 'TimeElementsInMicroseconds', '__type__': 'DateTimeValues', 'time_elements_tuple': (2010, 8, 12, 20, 6, 31, 429876) } json_dict = serializer.Serializer.ConvertDateTimeValuesToJSON( time_elements_object) self.assertEqual(json_dict, expected_json_dict)