Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/opt/local/bin/python
- import copy
- import unittest
- import types
- import exceptions
- KIM1_RECORD_BEGIN = ";"
- RECORD_CHECKSUM_LENGTH = 4 # of characters
- RECORD_IDENTIFIER_LENGTH = 1 # of characters
- RECORD_BYTE_LENGTH = 2 # of characters
- RECORD_ADDRESS_LENGTH = 4 # of characters
- RECORD_DATA_LENGTH = 48 # of characters
- ACTUAL_CHECKSUM_OFFSET = -4
- EXPECTED_RECORD_LENGTH = RECORD_IDENTIFIER_LENGTH + RECORD_BYTE_LENGTH + RECORD_ADDRESS_LENGTH + RECORD_DATA_LENGTH + RECORD_CHECKSUM_LENGTH
- class RecordIntegrityError(exceptions.Exception):
- def __init__(self, args):
- exceptions.Exception.__init__(self)
- print type(args)
- self.args=args
- def __str__(self):
- return "".join(self.args)
- class ChecksumValidationError(exceptions.Exception):
- def __init__(self, args):
- exceptions.Exception.__init__(self)
- self.args=args
- def __str__(self):
- return "".join(self.args)
- def checksum(record):
- if not record.startswith(KIM1_RECORD_BEGIN):
- raise RecordIntegrityError("\nInvalid Record: does not begin with -> %s" % KIM1_RECORD_BEGIN)
- if type(record) is not types.StringType:
- raise RecordIntegrityError("\nRecord data type must be StringType")
- actualRecordLength = len(record)
- if actualRecordLength != EXPECTED_RECORD_LENGTH:
- raise RecordIntegrityError("\nExpected record length: %lu bytes, Actual Record Length: %lu bytes," % (EXPECTED_RECORD_LENGTH, actualRecordLength))
- rawRecord = copy.deepcopy(record)
- expectedChecksum = int(rawRecord[ACTUAL_CHECKSUM_OFFSET:],16) & 0xFFFF
- workingRecord = iter(rawRecord[1:ACTUAL_CHECKSUM_OFFSET])
- calculatedChecksum = 0
- for byte in workingRecord:
- temp = []
- temp.append(byte)
- temp.append(workingRecord.next())
- calculatedChecksum += int("".join(temp),16) & 0xFFFF
- return expectedChecksum, calculatedChecksum
- class ChecksumValidaterPUT(unittest.TestCase):
- def setUp(self):
- self.record1 = ";180000FFEEDDCCBBAA0099887766554433221122334455667788990AFC"
- self.record2 = ";180218778E4017203C02A20C8E4217A2318E4017203C02A20E8E420717"
- self.record3 = ";180230EA65ED65EE85E9A204B5E995EACA10F938E999B0E8A5EB290FE8"
- #record4 = ";1800000204A900A885FA8570A2028672A50085FBA601A57049FF850B2D"
- #record5 = ";1800187191FAC8D0FBE6FBE4FBB0F5A672A50085FBA570CA1004A20FF6"
- #record6 = ";1800300291FAC8D0F6E6FBA501C5FBB0ECA50085FBA672A571CA100F73"
- #record7 = ";18004804A202A570D1FAD015C8D0F0E6FBA501C5FBB0E8C67210AD0F29"
- #record8 = ";180060A57049FF30A184FA4C4F1C0000000000CE1ECE1ECE9E7E5E09FB"
- self.testRecords = (self.record1, self.record2, self.record3)
- def test_checksumvalidater(self):
- for recnum, record in enumerate(self.testRecords,start=1):
- print"\nRecord # %2lu, %s" % (recnum,record),
- expectedChecksum, calculatedChecksum = checksum(record)
- self.assertEqual(expectedChecksum,calculatedChecksum)
- recnum +=1
- if __name__ == '__main__':
- unittest.main()
- Record # 1, ;180000FFEEDDCCBBAA0099887766554433221122334455667788990AFC
- Record # 2, ;180218778E4017203C02A20C8E4217A2318E4017203C02A20E8E420717
- .
- ----------------------------------------------------------------------
- Ran 1 test in 0.000s
- OK
- Record # 3, ;180230EA65ED65EE85E9A204B5E995EACA10F938E999B0E8A5EB290FE8
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement