def test_ape_item_init(self): ai = ApeTag.ApeItem() self.assertEqual([], ai) ai = ApeTag.ApeItem('BlaH') self.assertEqual(False, ai.readonly) self.assertEqual('utf8', ai.type) self.assertEqual('BlaH', ai.key) self.assertEqual([], ai) ai = ApeTag.ApeItem('BlaH', ['BlAh']) self.assertEqual(False, ai.readonly) self.assertEqual('utf8', ai.type) self.assertEqual('BlaH', ai.key) self.assertEqual(['BlAh'], ai) ai = ApeTag.ApeItem('BlaH', ['BlAh'], 'external') self.assertEqual(False, ai.readonly) self.assertEqual('external', ai.type) self.assertEqual('BlaH', ai.key) self.assertEqual(['BlAh'], ai) ai = ApeTag.ApeItem('BlaH', ['BlAh'], 'external', True) self.assertEqual(True, ai.readonly) self.assertEqual('external', ai.type) self.assertEqual('BlaH', ai.key) self.assertEqual(['BlAh'], ai)
def test_ape_item_valid_key(self): ai = ApeTag.ApeItem() # Test bad keys for x in [None, 1, '', 'x', 'x'*256]+["%s " % c for c in ApeTag._badapeitemkeychars]+ApeTag._badapeitemkeys: self.assertEqual(False, ai.validkey(x)) # Test good keys for x in ['xx', 'x'*255]+["%s " % chr(c) for c in range(32,128)]+["%s " % c for c in ApeTag._badapeitemkeys]: self.assertEqual(True, ai.validkey(x))
def test_ape_item_maketag(self): ai = ApeTag.ApeItem('BlaH', ['BlAh']) self.assertEqual("\04\0\0\0\0\0\0\0BlaH\0BlAh", ai.maketag()) ai.readonly=True self.assertEqual("\04\0\0\0\0\0\0\01BlaH\0BlAh", ai.maketag()) ai.type='external' self.assertEqual("\04\0\0\0\0\0\0\05BlaH\0BlAh", ai.maketag()) ai.append('XYZ') self.assertEqual("\010\0\0\0\0\0\0\05BlaH\0BlAh\0XYZ", ai.maketag())
def test_ape_item_parsetag(self): data = "\010\0\0\0\0\0\0\05BlaH\0BlAh\0XYZ" # Test simple parsing ai = ApeTag.ApeItem() cp = ai.parsetag(data, 0) self.assertEqual(2, len(ai)) self.assertEqual(len(data), cp) self.assertEqual(True, ai.readonly) self.assertEqual('external', ai.type) self.assertEqual('BlaH', ai.key) # Test parsing with bad key self.assertRaises(ApeTag.TagError, ApeTag.ApeItem().parsetag, "\0\0\0\0\0\0\0\0x\0", 0) # Test parsing with no key end self.assertRaises(ApeTag.TagError, ApeTag.ApeItem().parsetag, "\0\0\0\0\0\0\0\0xx", 0) # Test parsing with bad start value self.assertRaises(ApeTag.TagError, ApeTag.ApeItem().parsetag, data, 1) # Test parsing with bad flags self.assertRaises(ApeTag.TagError, ApeTag.ApeItem().parsetag, "\0\0\0\0\0\0\0\010xx\0", 1) # Test parsing with length longer than string self.assertRaises(ApeTag.TagError, ApeTag.ApeItem().parsetag, "\01\0\0\0\0\0\0\010xx\0", 1) # Test parsing with length shorter than string gives valid ApeItem # Of course, the next item will probably be parsed incorrectly ai = ApeTag.ApeItem() cp = ai.parsetag('\03' + data[1:], 0) self.assertEqual(16, cp) self.assertEqual('BlaH', ai.key) self.assertEqual(['BlA'], ai) # Test parsing of invalid UTF-8 self.assertRaises(ApeTag.TagError, ApeTag.ApeItem().parsetag, "\01\0\0\0\0\0\0\010xx\0\x83", 1)
def test_update(self): self.assertFilesEqual('good-empty', 'good-empty', lambda: ApeTag.createape('test.tag')) self.assertFilesEqual('missing-ok', 'good-empty', lambda: ApeTag.createape('test.tag')) self.assertFilesEqual( 'good-empty', 'good-simple-1', lambda: ApeTag.createape('test.tag', {'name': 'value'})) self.assertFilesEqual( 'good-simple-1', 'good-empty', lambda: ApeTag.updateape('test.tag', removefields=['name'])) self.assertFilesEqual( 'good-simple-1', 'good-empty', lambda: ApeTag.updateape('test.tag', removefields=['Name'])) self.assertFilesEqual( 'good-empty', 'good-simple-1-ro-external', lambda: ApeTag.createape( 'test.tag', {'name': ApeTag.ApeItem('name', ['value'], 'external', True)})) self.assertFilesEqual( 'good-empty', 'good-binary-non-utf8-value', lambda: ApeTag.createape( 'test.tag', {'name': ApeTag.ApeItem('name', ['v\x81lue'], 'binary')})) d = {} for i in range(63): d["%in" % i] = "a" * i self.assertFilesEqual('good-empty', 'good-many-items', lambda: ApeTag.createape('test.tag', d)) self.assertFilesEqual( 'good-empty', 'good-multiple-values', lambda: ApeTag.createape('test.tag', {'name': ['va', 'ue']})) self.assertFilesEqual( 'good-multiple-values', 'good-simple-1-uc', lambda: ApeTag.createape('test.tag', {'NAME': 'value'})) self.assertFilesEqual( 'good-empty', 'good-simple-1-utf8', lambda: ApeTag.createape('test.tag', {'name': u'v\xc2\xd5'})) d['63n'] = 'a' * 63 d['64n'] = 'a' * 64 self.assertTagErrorRaised('New tag has too many items: 65 items', lambda: ApeTag.createape('test.tag', d)) self.assertTagErrorRaised( 'New tag is too large: 8193 bytes', lambda: ApeTag.createape('test.tag', {'xn': 'a' * 8118})) self.assertTagErrorRaised( "Invalid item key for ape tag item: 'n'", lambda: ApeTag.createape('test.tag', {'n': 'a'})) self.assertTagErrorRaised( "Invalid item key for ape tag item: 'n\\x00'", lambda: ApeTag.createape('test.tag', {'n\0': 'a'})) self.assertTagErrorRaised( "Invalid item key for ape tag item: 'n\\x1f'", lambda: ApeTag.createape('test.tag', {'n\x1f': 'a'})) self.assertTagErrorRaised( "Invalid item key for ape tag item: 'n\\x80'", lambda: ApeTag.createape('test.tag', {'n\x80': 'a'})) self.assertTagErrorRaised( "Invalid item key for ape tag item: 'n\\xff'", lambda: ApeTag.createape('test.tag', {'n\xff': 'a'})) self.assertTagErrorRaised( "Invalid item key for ape tag item: 'tag'", lambda: ApeTag.createape('test.tag', {'tag': 'a'})) self.assertTagErrorRaised( UnicodeDecodeError, lambda: ApeTag.createape('test.tag', {'ab': 'v\xff'})) self.assertTagErrorRaised( "Invalid item type for ape tag item: 'foo'", lambda: ApeTag.createape( 'test.tag', {'ab': ApeTag.ApeItem('name', ['value'], 'foo')})) self.assertFilesEqual( 'good-empty', 'good-simple-1', lambda: ApeTag.createape( file('test.tag', 'r+b'), {'name': 'value'}))