Changeset View
Changeset View
Standalone View
Standalone View
swh/model/tests/test_identifiers.py
Show First 20 Lines • Show All 799 Lines • ▼ Show 20 Lines | def setUp(self): | ||||
"snapshot": CoreSWHID.from_string("swh:1:snp:" + "00" * 20), | "snapshot": CoreSWHID.from_string("swh:1:snp:" + "00" * 20), | ||||
"release": CoreSWHID.from_string("swh:1:rel:" + "01" * 20), | "release": CoreSWHID.from_string("swh:1:rel:" + "01" * 20), | ||||
"revision": CoreSWHID.from_string("swh:1:rev:" + "02" * 20), | "revision": CoreSWHID.from_string("swh:1:rev:" + "02" * 20), | ||||
"path": b"/abc/def", | "path": b"/abc/def", | ||||
"directory": CoreSWHID.from_string("swh:1:dir:" + "03" * 20), | "directory": CoreSWHID.from_string("swh:1:dir:" + "03" * 20), | ||||
} | } | ||||
def test_minimal(self): | def test_minimal(self): | ||||
manifest = ( | git_object = ( | ||||
b"raw_extrinsic_metadata 210\0" | b"raw_extrinsic_metadata 210\0" | ||||
b"target swh:1:cnt:568aaf43d83b2c3df8067f3bedbb97d83260be6d\n" | b"target swh:1:cnt:568aaf43d83b2c3df8067f3bedbb97d83260be6d\n" | ||||
b"discovery_date 1611574071\n" | b"discovery_date 1611574071\n" | ||||
b"authority forge https://forge.softwareheritage.org/\n" | b"authority forge https://forge.softwareheritage.org/\n" | ||||
b"fetcher swh-phabricator-metadata-fetcher 0.0.1\n" | b"fetcher swh-phabricator-metadata-fetcher 0.0.1\n" | ||||
b"format json\n" | b"format json\n" | ||||
b"\n" | b"\n" | ||||
b'{"foo": "bar"}' | b'{"foo": "bar"}' | ||||
) | ) | ||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.raw_extrinsic_metadata_git_object(self.minimal), git_object, | |||||
) | |||||
self.assertEqual( | |||||
identifiers.raw_extrinsic_metadata_identifier(self.minimal), | identifiers.raw_extrinsic_metadata_identifier(self.minimal), | ||||
hashlib.sha1(manifest).hexdigest(), | hashlib.sha1(git_object).hexdigest(), | ||||
) | ) | ||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.raw_extrinsic_metadata_identifier(self.minimal), | identifiers.raw_extrinsic_metadata_identifier(self.minimal), | ||||
"5c13f20ba336e44549baf3d7b9305b027ec9f43d", | "5c13f20ba336e44549baf3d7b9305b027ec9f43d", | ||||
) | ) | ||||
def test_maximal(self): | def test_maximal(self): | ||||
manifest = ( | git_object = ( | ||||
b"raw_extrinsic_metadata 533\0" | b"raw_extrinsic_metadata 533\0" | ||||
b"target swh:1:cnt:568aaf43d83b2c3df8067f3bedbb97d83260be6d\n" | b"target swh:1:cnt:568aaf43d83b2c3df8067f3bedbb97d83260be6d\n" | ||||
b"discovery_date 1611574071\n" | b"discovery_date 1611574071\n" | ||||
b"authority forge https://forge.softwareheritage.org/\n" | b"authority forge https://forge.softwareheritage.org/\n" | ||||
b"fetcher swh-phabricator-metadata-fetcher 0.0.1\n" | b"fetcher swh-phabricator-metadata-fetcher 0.0.1\n" | ||||
b"format json\n" | b"format json\n" | ||||
b"origin https://forge.softwareheritage.org/source/swh-model/\n" | b"origin https://forge.softwareheritage.org/source/swh-model/\n" | ||||
b"visit 42\n" | b"visit 42\n" | ||||
b"snapshot swh:1:snp:0000000000000000000000000000000000000000\n" | b"snapshot swh:1:snp:0000000000000000000000000000000000000000\n" | ||||
b"release swh:1:rel:0101010101010101010101010101010101010101\n" | b"release swh:1:rel:0101010101010101010101010101010101010101\n" | ||||
b"revision swh:1:rev:0202020202020202020202020202020202020202\n" | b"revision swh:1:rev:0202020202020202020202020202020202020202\n" | ||||
b"path /abc/def\n" | b"path /abc/def\n" | ||||
b"directory swh:1:dir:0303030303030303030303030303030303030303\n" | b"directory swh:1:dir:0303030303030303030303030303030303030303\n" | ||||
b"\n" | b"\n" | ||||
b'{"foo": "bar"}' | b'{"foo": "bar"}' | ||||
) | ) | ||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.raw_extrinsic_metadata_git_object(self.maximal), git_object, | |||||
) | |||||
self.assertEqual( | |||||
identifiers.raw_extrinsic_metadata_identifier(self.maximal), | identifiers.raw_extrinsic_metadata_identifier(self.maximal), | ||||
hashlib.sha1(manifest).hexdigest(), | hashlib.sha1(git_object).hexdigest(), | ||||
) | ) | ||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.raw_extrinsic_metadata_identifier(self.maximal), | identifiers.raw_extrinsic_metadata_identifier(self.maximal), | ||||
"f96966e1093d15236a31fde07e47d5b1c9428049", | "f96966e1093d15236a31fde07e47d5b1c9428049", | ||||
) | ) | ||||
def test_nonascii_path(self): | def test_nonascii_path(self): | ||||
metadata = { | metadata = { | ||||
**self.minimal, | **self.minimal, | ||||
"path": b"/ab\nc/d\xf0\x9f\xa4\xb7e\x00f", | "path": b"/ab\nc/d\xf0\x9f\xa4\xb7e\x00f", | ||||
} | } | ||||
manifest = ( | git_object = ( | ||||
b"raw_extrinsic_metadata 231\0" | b"raw_extrinsic_metadata 231\0" | ||||
b"target swh:1:cnt:568aaf43d83b2c3df8067f3bedbb97d83260be6d\n" | b"target swh:1:cnt:568aaf43d83b2c3df8067f3bedbb97d83260be6d\n" | ||||
b"discovery_date 1611574071\n" | b"discovery_date 1611574071\n" | ||||
b"authority forge https://forge.softwareheritage.org/\n" | b"authority forge https://forge.softwareheritage.org/\n" | ||||
b"fetcher swh-phabricator-metadata-fetcher 0.0.1\n" | b"fetcher swh-phabricator-metadata-fetcher 0.0.1\n" | ||||
b"format json\n" | b"format json\n" | ||||
b"path /ab\n" | b"path /ab\n" | ||||
b" c/d\xf0\x9f\xa4\xb7e\x00f\n" | b" c/d\xf0\x9f\xa4\xb7e\x00f\n" | ||||
b"\n" | b"\n" | ||||
b'{"foo": "bar"}' | b'{"foo": "bar"}' | ||||
) | ) | ||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.raw_extrinsic_metadata_git_object(metadata), git_object, | |||||
) | |||||
self.assertEqual( | |||||
identifiers.raw_extrinsic_metadata_identifier(metadata), | identifiers.raw_extrinsic_metadata_identifier(metadata), | ||||
hashlib.sha1(manifest).hexdigest(), | hashlib.sha1(git_object).hexdigest(), | ||||
) | ) | ||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.raw_extrinsic_metadata_identifier(metadata), | identifiers.raw_extrinsic_metadata_identifier(metadata), | ||||
"7cc83fd1912176510c083f5df43f01b09af4b333", | "7cc83fd1912176510c083f5df43f01b09af4b333", | ||||
) | ) | ||||
def test_timezone_insensitive(self): | def test_timezone_insensitive(self): | ||||
"""Checks the timezone of the datetime.datetime does not affect the | """Checks the timezone of the datetime.datetime does not affect the | ||||
hashed manifest.""" | hashed git_object.""" | ||||
utc_plus_one = datetime.timezone(datetime.timedelta(hours=1)) | utc_plus_one = datetime.timezone(datetime.timedelta(hours=1)) | ||||
metadata = { | metadata = { | ||||
**self.minimal, | **self.minimal, | ||||
"discovery_date": datetime.datetime( | "discovery_date": datetime.datetime( | ||||
2021, 1, 25, 12, 27, 51, tzinfo=utc_plus_one, | 2021, 1, 25, 12, 27, 51, tzinfo=utc_plus_one, | ||||
), | ), | ||||
} | } | ||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.raw_extrinsic_metadata_git_object(self.minimal), | |||||
identifiers.raw_extrinsic_metadata_git_object(metadata), | |||||
) | |||||
self.assertEqual( | |||||
identifiers.raw_extrinsic_metadata_identifier(self.minimal), | identifiers.raw_extrinsic_metadata_identifier(self.minimal), | ||||
identifiers.raw_extrinsic_metadata_identifier(metadata), | identifiers.raw_extrinsic_metadata_identifier(metadata), | ||||
) | ) | ||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.raw_extrinsic_metadata_identifier(metadata), | identifiers.raw_extrinsic_metadata_identifier(metadata), | ||||
"5c13f20ba336e44549baf3d7b9305b027ec9f43d", | "5c13f20ba336e44549baf3d7b9305b027ec9f43d", | ||||
) | ) | ||||
def test_microsecond_insensitive(self): | def test_microsecond_insensitive(self): | ||||
"""Checks the microseconds of the datetime.datetime does not affect the | """Checks the microseconds of the datetime.datetime does not affect the | ||||
hashed manifest.""" | hashed manifest.""" | ||||
metadata = { | metadata = { | ||||
**self.minimal, | **self.minimal, | ||||
"discovery_date": datetime.datetime( | "discovery_date": datetime.datetime( | ||||
2021, 1, 25, 11, 27, 51, 123456, tzinfo=datetime.timezone.utc, | 2021, 1, 25, 11, 27, 51, 123456, tzinfo=datetime.timezone.utc, | ||||
), | ), | ||||
} | } | ||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.raw_extrinsic_metadata_git_object(self.minimal), | |||||
identifiers.raw_extrinsic_metadata_git_object(metadata), | |||||
) | |||||
self.assertEqual( | |||||
identifiers.raw_extrinsic_metadata_identifier(self.minimal), | identifiers.raw_extrinsic_metadata_identifier(self.minimal), | ||||
identifiers.raw_extrinsic_metadata_identifier(metadata), | identifiers.raw_extrinsic_metadata_identifier(metadata), | ||||
) | ) | ||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.raw_extrinsic_metadata_identifier(metadata), | identifiers.raw_extrinsic_metadata_identifier(metadata), | ||||
"5c13f20ba336e44549baf3d7b9305b027ec9f43d", | "5c13f20ba336e44549baf3d7b9305b027ec9f43d", | ||||
) | ) | ||||
def test_noninteger_timezone(self): | def test_noninteger_timezone(self): | ||||
"""Checks the discovery_date is translated to UTC before truncating | """Checks the discovery_date is translated to UTC before truncating | ||||
microseconds""" | microseconds""" | ||||
tz = datetime.timezone(datetime.timedelta(microseconds=-42)) | tz = datetime.timezone(datetime.timedelta(microseconds=-42)) | ||||
metadata = { | metadata = { | ||||
**self.minimal, | **self.minimal, | ||||
"discovery_date": datetime.datetime( | "discovery_date": datetime.datetime( | ||||
2021, 1, 25, 11, 27, 50, 1_000_000 - 42, tzinfo=tz, | 2021, 1, 25, 11, 27, 50, 1_000_000 - 42, tzinfo=tz, | ||||
), | ), | ||||
} | } | ||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.raw_extrinsic_metadata_git_object(self.minimal), | |||||
identifiers.raw_extrinsic_metadata_git_object(metadata), | |||||
) | |||||
self.assertEqual( | |||||
identifiers.raw_extrinsic_metadata_identifier(self.minimal), | identifiers.raw_extrinsic_metadata_identifier(self.minimal), | ||||
identifiers.raw_extrinsic_metadata_identifier(metadata), | identifiers.raw_extrinsic_metadata_identifier(metadata), | ||||
) | ) | ||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.raw_extrinsic_metadata_identifier(metadata), | identifiers.raw_extrinsic_metadata_identifier(metadata), | ||||
"5c13f20ba336e44549baf3d7b9305b027ec9f43d", | "5c13f20ba336e44549baf3d7b9305b027ec9f43d", | ||||
) | ) | ||||
def test_negative_timestamp(self): | def test_negative_timestamp(self): | ||||
metadata = { | metadata = { | ||||
**self.minimal, | **self.minimal, | ||||
"discovery_date": datetime.datetime( | "discovery_date": datetime.datetime( | ||||
1960, 1, 25, 11, 27, 51, tzinfo=datetime.timezone.utc, | 1960, 1, 25, 11, 27, 51, tzinfo=datetime.timezone.utc, | ||||
), | ), | ||||
} | } | ||||
manifest = ( | git_object = ( | ||||
b"raw_extrinsic_metadata 210\0" | b"raw_extrinsic_metadata 210\0" | ||||
b"target swh:1:cnt:568aaf43d83b2c3df8067f3bedbb97d83260be6d\n" | b"target swh:1:cnt:568aaf43d83b2c3df8067f3bedbb97d83260be6d\n" | ||||
b"discovery_date -313504329\n" | b"discovery_date -313504329\n" | ||||
b"authority forge https://forge.softwareheritage.org/\n" | b"authority forge https://forge.softwareheritage.org/\n" | ||||
b"fetcher swh-phabricator-metadata-fetcher 0.0.1\n" | b"fetcher swh-phabricator-metadata-fetcher 0.0.1\n" | ||||
b"format json\n" | b"format json\n" | ||||
b"\n" | b"\n" | ||||
b'{"foo": "bar"}' | b'{"foo": "bar"}' | ||||
) | ) | ||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.raw_extrinsic_metadata_git_object(metadata), git_object, | |||||
) | |||||
self.assertEqual( | |||||
identifiers.raw_extrinsic_metadata_identifier(metadata), | identifiers.raw_extrinsic_metadata_identifier(metadata), | ||||
hashlib.sha1(manifest).hexdigest(), | hashlib.sha1(git_object).hexdigest(), | ||||
) | ) | ||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.raw_extrinsic_metadata_identifier(metadata), | identifiers.raw_extrinsic_metadata_identifier(metadata), | ||||
"895d0821a2991dd376ddc303424aceb7c68280f9", | "895d0821a2991dd376ddc303424aceb7c68280f9", | ||||
) | ) | ||||
def test_epoch(self): | def test_epoch(self): | ||||
metadata = { | metadata = { | ||||
**self.minimal, | **self.minimal, | ||||
"discovery_date": datetime.datetime( | "discovery_date": datetime.datetime( | ||||
1970, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc, | 1970, 1, 1, 0, 0, 0, tzinfo=datetime.timezone.utc, | ||||
), | ), | ||||
} | } | ||||
manifest = ( | git_object = ( | ||||
b"raw_extrinsic_metadata 201\0" | b"raw_extrinsic_metadata 201\0" | ||||
b"target swh:1:cnt:568aaf43d83b2c3df8067f3bedbb97d83260be6d\n" | b"target swh:1:cnt:568aaf43d83b2c3df8067f3bedbb97d83260be6d\n" | ||||
b"discovery_date 0\n" | b"discovery_date 0\n" | ||||
b"authority forge https://forge.softwareheritage.org/\n" | b"authority forge https://forge.softwareheritage.org/\n" | ||||
b"fetcher swh-phabricator-metadata-fetcher 0.0.1\n" | b"fetcher swh-phabricator-metadata-fetcher 0.0.1\n" | ||||
b"format json\n" | b"format json\n" | ||||
b"\n" | b"\n" | ||||
b'{"foo": "bar"}' | b'{"foo": "bar"}' | ||||
) | ) | ||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.raw_extrinsic_metadata_git_object(metadata), git_object, | |||||
) | |||||
self.assertEqual( | |||||
identifiers.raw_extrinsic_metadata_identifier(metadata), | identifiers.raw_extrinsic_metadata_identifier(metadata), | ||||
hashlib.sha1(manifest).hexdigest(), | hashlib.sha1(git_object).hexdigest(), | ||||
) | ) | ||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.raw_extrinsic_metadata_identifier(metadata), | identifiers.raw_extrinsic_metadata_identifier(metadata), | ||||
"27a53df54ace35ebd910493cdc70b334d6b7cb88", | "27a53df54ace35ebd910493cdc70b334d6b7cb88", | ||||
) | ) | ||||
def test_negative_epoch(self): | def test_negative_epoch(self): | ||||
metadata = { | metadata = { | ||||
**self.minimal, | **self.minimal, | ||||
"discovery_date": datetime.datetime( | "discovery_date": datetime.datetime( | ||||
1969, 12, 31, 23, 59, 59, 1, tzinfo=datetime.timezone.utc, | 1969, 12, 31, 23, 59, 59, 1, tzinfo=datetime.timezone.utc, | ||||
), | ), | ||||
} | } | ||||
manifest = ( | git_object = ( | ||||
b"raw_extrinsic_metadata 202\0" | b"raw_extrinsic_metadata 202\0" | ||||
b"target swh:1:cnt:568aaf43d83b2c3df8067f3bedbb97d83260be6d\n" | b"target swh:1:cnt:568aaf43d83b2c3df8067f3bedbb97d83260be6d\n" | ||||
b"discovery_date -1\n" | b"discovery_date -1\n" | ||||
b"authority forge https://forge.softwareheritage.org/\n" | b"authority forge https://forge.softwareheritage.org/\n" | ||||
b"fetcher swh-phabricator-metadata-fetcher 0.0.1\n" | b"fetcher swh-phabricator-metadata-fetcher 0.0.1\n" | ||||
b"format json\n" | b"format json\n" | ||||
b"\n" | b"\n" | ||||
b'{"foo": "bar"}' | b'{"foo": "bar"}' | ||||
) | ) | ||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.raw_extrinsic_metadata_git_object(metadata), git_object, | |||||
) | |||||
self.assertEqual( | |||||
identifiers.raw_extrinsic_metadata_identifier(metadata), | identifiers.raw_extrinsic_metadata_identifier(metadata), | ||||
hashlib.sha1(manifest).hexdigest(), | hashlib.sha1(git_object).hexdigest(), | ||||
) | ) | ||||
self.assertEqual( | self.assertEqual( | ||||
identifiers.raw_extrinsic_metadata_identifier(metadata), | identifiers.raw_extrinsic_metadata_identifier(metadata), | ||||
"be7154a8fd49d87f81547ea634d1e2152907d089", | "be7154a8fd49d87f81547ea634d1e2152907d089", | ||||
) | ) | ||||
origin_example = { | origin_example = { | ||||
▲ Show 20 Lines • Show All 731 Lines • Show Last 20 Lines |