Changeset View
Changeset View
Standalone View
Standalone View
swh/model/tests/test_identifiers.py
# Copyright (C) 2015-2018 The Software Heritage developers | # Copyright (C) 2015-2018 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU General Public License version 3, or any later version | # License: GNU General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
import binascii | import binascii | ||||
import datetime | import datetime | ||||
import unittest | import unittest | ||||
from nose.tools import istest | |||||
from swh.model import hashutil, identifiers | from swh.model import hashutil, identifiers | ||||
from swh.model.exceptions import ValidationError | from swh.model.exceptions import ValidationError | ||||
from swh.model.identifiers import SNAPSHOT, RELEASE, REVISION, DIRECTORY | from swh.model.identifiers import (CONTENT, DIRECTORY, | ||||
from swh.model.identifiers import CONTENT, PERSISTENT_IDENTIFIER_TYPES | PERSISTENT_IDENTIFIER_TYPES, RELEASE, | ||||
from swh.model.identifiers import PersistentId | REVISION, SNAPSHOT, PersistentId) | ||||
class UtilityFunctionsIdentifier(unittest.TestCase): | class UtilityFunctionsIdentifier(unittest.TestCase): | ||||
def setUp(self): | def setUp(self): | ||||
self.str_id = 'c2e41aae41ac17bd4a650770d6ee77f62e52235b' | self.str_id = 'c2e41aae41ac17bd4a650770d6ee77f62e52235b' | ||||
self.bytes_id = binascii.unhexlify(self.str_id) | self.bytes_id = binascii.unhexlify(self.str_id) | ||||
self.bad_type_id = object() | self.bad_type_id = object() | ||||
@istest | def test_identifier_to_bytes(self): | ||||
def identifier_to_bytes(self): | |||||
for id in [self.str_id, self.bytes_id]: | for id in [self.str_id, self.bytes_id]: | ||||
self.assertEqual(identifiers.identifier_to_bytes(id), | self.assertEqual(identifiers.identifier_to_bytes(id), | ||||
self.bytes_id) | self.bytes_id) | ||||
# wrong length | # wrong length | ||||
with self.assertRaises(ValueError) as cm: | with self.assertRaises(ValueError) as cm: | ||||
identifiers.identifier_to_bytes(id[:-2]) | identifiers.identifier_to_bytes(id[:-2]) | ||||
self.assertIn('length', str(cm.exception)) | self.assertIn('length', str(cm.exception)) | ||||
with self.assertRaises(ValueError) as cm: | with self.assertRaises(ValueError) as cm: | ||||
identifiers.identifier_to_bytes(self.bad_type_id) | identifiers.identifier_to_bytes(self.bad_type_id) | ||||
self.assertIn('type', str(cm.exception)) | self.assertIn('type', str(cm.exception)) | ||||
@istest | def test_identifier_to_str(self): | ||||
def identifier_to_str(self): | |||||
for id in [self.str_id, self.bytes_id]: | for id in [self.str_id, self.bytes_id]: | ||||
self.assertEqual(identifiers.identifier_to_str(id), | self.assertEqual(identifiers.identifier_to_str(id), | ||||
self.str_id) | self.str_id) | ||||
# wrong length | # wrong length | ||||
with self.assertRaises(ValueError) as cm: | with self.assertRaises(ValueError) as cm: | ||||
identifiers.identifier_to_str(id[:-2]) | identifiers.identifier_to_str(id[:-2]) | ||||
Show All 26 Lines | def setUp(self): | ||||
] | ] | ||||
self.offsets = { | self.offsets = { | ||||
0: b'+0000', | 0: b'+0000', | ||||
-630: b'-1030', | -630: b'-1030', | ||||
800: b'+1320', | 800: b'+1320', | ||||
} | } | ||||
@istest | def test_format_date(self): | ||||
def format_date(self): | |||||
for date_repr, date in self.dates.items(): | for date_repr, date in self.dates.items(): | ||||
self.assertEqual(identifiers.format_date(date), date_repr) | self.assertEqual(identifiers.format_date(date), date_repr) | ||||
@istest | def test_format_date_fail(self): | ||||
def format_date_fail(self): | |||||
for date in self.broken_dates: | for date in self.broken_dates: | ||||
with self.assertRaises(ValueError): | with self.assertRaises(ValueError): | ||||
identifiers.format_date(date) | identifiers.format_date(date) | ||||
@istest | def test_format_offset(self): | ||||
def format_offset(self): | |||||
for offset, res in self.offsets.items(): | for offset, res in self.offsets.items(): | ||||
self.assertEqual(identifiers.format_offset(offset), res) | self.assertEqual(identifiers.format_offset(offset), res) | ||||
class ContentIdentifier(unittest.TestCase): | class ContentIdentifier(unittest.TestCase): | ||||
def setUp(self): | def setUp(self): | ||||
self.content = { | self.content = { | ||||
'status': 'visible', | 'status': 'visible', | ||||
'length': 5, | 'length': 5, | ||||
'data': b'1984\n', | 'data': b'1984\n', | ||||
'ctime': datetime.datetime(2015, 11, 22, 16, 33, 56, | 'ctime': datetime.datetime(2015, 11, 22, 16, 33, 56, | ||||
tzinfo=datetime.timezone.utc), | tzinfo=datetime.timezone.utc), | ||||
} | } | ||||
self.content_id = hashutil.hash_data(self.content['data']) | self.content_id = hashutil.hash_data(self.content['data']) | ||||
@istest | def test_content_identifier(self): | ||||
def content_identifier(self): | |||||
self.assertEqual(identifiers.content_identifier(self.content), | self.assertEqual(identifiers.content_identifier(self.content), | ||||
self.content_id) | self.content_id) | ||||
class DirectoryIdentifier(unittest.TestCase): | class DirectoryIdentifier(unittest.TestCase): | ||||
def setUp(self): | def setUp(self): | ||||
self.directory = { | self.directory = { | ||||
'id': 'c2e41aae41ac17bd4a650770d6ee77f62e52235b', | 'id': 'c2e41aae41ac17bd4a650770d6ee77f62e52235b', | ||||
▲ Show 20 Lines • Show All 85 Lines • ▼ Show 20 Lines | def setUp(self): | ||||
], | ], | ||||
} | } | ||||
self.empty_directory = { | self.empty_directory = { | ||||
'id': '4b825dc642cb6eb9a060e54bf8d69288fbee4904', | 'id': '4b825dc642cb6eb9a060e54bf8d69288fbee4904', | ||||
'entries': [], | 'entries': [], | ||||
} | } | ||||
@istest | def test_dir_identifier(self): | ||||
def dir_identifier(self): | |||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.directory_identifier(self.directory), | identifiers.directory_identifier(self.directory), | ||||
self.directory['id']) | self.directory['id']) | ||||
@istest | def test_dir_identifier_empty_directory(self): | ||||
def dir_identifier_empty_directory(self): | |||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.directory_identifier(self.empty_directory), | identifiers.directory_identifier(self.empty_directory), | ||||
self.empty_directory['id']) | self.empty_directory['id']) | ||||
class RevisionIdentifier(unittest.TestCase): | class RevisionIdentifier(unittest.TestCase): | ||||
def setUp(self): | def setUp(self): | ||||
▲ Show 20 Lines • Show All 220 Lines • ▼ Show 20 Lines | ''' | ||||
'metadata': { | 'metadata': { | ||||
'extra_headers': [ | 'extra_headers': [ | ||||
['svn-repo-uuid', '046f1af7-66c2-d61b-5410-ce57b7db7bff'], | ['svn-repo-uuid', '046f1af7-66c2-d61b-5410-ce57b7db7bff'], | ||||
['svn-revision', 10], | ['svn-revision', 10], | ||||
] | ] | ||||
} | } | ||||
} | } | ||||
@istest | def test_revision_identifier(self): | ||||
def revision_identifier(self): | |||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.revision_identifier(self.revision), | identifiers.revision_identifier(self.revision), | ||||
identifiers.identifier_to_str(self.revision['id']), | identifiers.identifier_to_str(self.revision['id']), | ||||
) | ) | ||||
@istest | def test_revision_identifier_none_metadata(self): | ||||
def revision_identifier_none_metadata(self): | |||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.revision_identifier(self.revision_none_metadata), | identifiers.revision_identifier(self.revision_none_metadata), | ||||
identifiers.identifier_to_str(self.revision_none_metadata['id']), | identifiers.identifier_to_str(self.revision_none_metadata['id']), | ||||
) | ) | ||||
@istest | def test_revision_identifier_synthetic(self): | ||||
def revision_identifier_synthetic(self): | |||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.revision_identifier(self.synthetic_revision), | identifiers.revision_identifier(self.synthetic_revision), | ||||
identifiers.identifier_to_str(self.synthetic_revision['id']), | identifiers.identifier_to_str(self.synthetic_revision['id']), | ||||
) | ) | ||||
@istest | def test_revision_identifier_with_extra_headers(self): | ||||
def revision_identifier_with_extra_headers(self): | |||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.revision_identifier( | identifiers.revision_identifier( | ||||
self.revision_with_extra_headers), | self.revision_with_extra_headers), | ||||
identifiers.identifier_to_str( | identifiers.identifier_to_str( | ||||
self.revision_with_extra_headers['id']), | self.revision_with_extra_headers['id']), | ||||
) | ) | ||||
@istest | def test_revision_identifier_with_gpgsig(self): | ||||
def revision_identifier_with_gpgsig(self): | |||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.revision_identifier( | identifiers.revision_identifier( | ||||
self.revision_with_gpgsig), | self.revision_with_gpgsig), | ||||
identifiers.identifier_to_str( | identifiers.identifier_to_str( | ||||
self.revision_with_gpgsig['id']), | self.revision_with_gpgsig['id']), | ||||
) | ) | ||||
@istest | def test_revision_identifier_no_message(self): | ||||
def revision_identifier_no_message(self): | |||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.revision_identifier( | identifiers.revision_identifier( | ||||
self.revision_no_message), | self.revision_no_message), | ||||
identifiers.identifier_to_str( | identifiers.identifier_to_str( | ||||
self.revision_no_message['id']), | self.revision_no_message['id']), | ||||
) | ) | ||||
@istest | def test_revision_identifier_empty_message(self): | ||||
def revision_identifier_empty_message(self): | |||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.revision_identifier( | identifiers.revision_identifier( | ||||
self.revision_empty_message), | self.revision_empty_message), | ||||
identifiers.identifier_to_str( | identifiers.identifier_to_str( | ||||
self.revision_empty_message['id']), | self.revision_empty_message['id']), | ||||
) | ) | ||||
@istest | def test_revision_identifier_only_fullname(self): | ||||
def revision_identifier_only_fullname(self): | |||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.revision_identifier( | identifiers.revision_identifier( | ||||
self.revision_only_fullname), | self.revision_only_fullname), | ||||
identifiers.identifier_to_str( | identifiers.identifier_to_str( | ||||
self.revision_only_fullname['id']), | self.revision_only_fullname['id']), | ||||
) | ) | ||||
▲ Show 20 Lines • Show All 108 Lines • ▼ Show 20 Lines | ''', | ||||
'message': b'Release of v0.3.2.', | 'message': b'Release of v0.3.2.', | ||||
'name': b'0.3.2', | 'name': b'0.3.2', | ||||
'synthetic': False, | 'synthetic': False, | ||||
'target': (b'\xc0j\xa3\xd9;x\xa2\x86\\I5\x17' | 'target': (b'\xc0j\xa3\xd9;x\xa2\x86\\I5\x17' | ||||
b'\x000\xf8\xc2\xd79o\xd3'), | b'\x000\xf8\xc2\xd79o\xd3'), | ||||
'target_type': 'revision', | 'target_type': 'revision', | ||||
} | } | ||||
@istest | def test_release_identifier(self): | ||||
def release_identifier(self): | |||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.release_identifier(self.release), | identifiers.release_identifier(self.release), | ||||
identifiers.identifier_to_str(self.release['id']) | identifiers.identifier_to_str(self.release['id']) | ||||
) | ) | ||||
@istest | def test_release_identifier_no_author(self): | ||||
def release_identifier_no_author(self): | |||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.release_identifier(self.release_no_author), | identifiers.release_identifier(self.release_no_author), | ||||
identifiers.identifier_to_str(self.release_no_author['id']) | identifiers.identifier_to_str(self.release_no_author['id']) | ||||
) | ) | ||||
@istest | def test_release_identifier_no_message(self): | ||||
def release_identifier_no_message(self): | |||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.release_identifier(self.release_no_message), | identifiers.release_identifier(self.release_no_message), | ||||
identifiers.identifier_to_str(self.release_no_message['id']) | identifiers.identifier_to_str(self.release_no_message['id']) | ||||
) | ) | ||||
@istest | def test_release_identifier_empty_message(self): | ||||
def release_identifier_empty_message(self): | |||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.release_identifier(self.release_empty_message), | identifiers.release_identifier(self.release_empty_message), | ||||
identifiers.identifier_to_str(self.release_empty_message['id']) | identifiers.identifier_to_str(self.release_empty_message['id']) | ||||
) | ) | ||||
@istest | def test_release_identifier_negative_utc(self): | ||||
def release_identifier_negative_utc(self): | |||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.release_identifier(self.release_negative_utc), | identifiers.release_identifier(self.release_negative_utc), | ||||
identifiers.identifier_to_str(self.release_negative_utc['id']) | identifiers.identifier_to_str(self.release_negative_utc['id']) | ||||
) | ) | ||||
@istest | def test_release_identifier_newline_in_author(self): | ||||
def release_identifier_newline_in_author(self): | |||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.release_identifier(self.release_newline_in_author), | identifiers.release_identifier(self.release_newline_in_author), | ||||
identifiers.identifier_to_str(self.release_newline_in_author['id']) | identifiers.identifier_to_str(self.release_newline_in_author['id']) | ||||
) | ) | ||||
class SnapshotIdentifier(unittest.TestCase): | class SnapshotIdentifier(unittest.TestCase): | ||||
def setUp(self): | def setUp(self): | ||||
▲ Show 20 Lines • Show All 229 Lines • Show Last 20 Lines |