mirror of
https://github.com/microsoft/debugpy.git
synced 2025-12-23 08:48:12 +00:00
210 lines
6.9 KiB
Python
210 lines
6.9 KiB
Python
from datetime import datetime
|
|
import io
|
|
import os.path
|
|
from textwrap import dedent
|
|
import unittest
|
|
|
|
from .helpers import StubOpener
|
|
from debugger_protocol.schema.upstream import URL as UPSTREAM
|
|
from debugger_protocol.schema.metadata import (
|
|
open_metadata, read_metadata,
|
|
MetadataError, Metadata)
|
|
|
|
|
|
class Stringlike:
|
|
|
|
def __init__(self, value):
|
|
self.value = value
|
|
|
|
def __str__(self):
|
|
return self.value
|
|
|
|
|
|
class Hash(Stringlike):
|
|
pass
|
|
|
|
|
|
class OpenMetadataTests(unittest.TestCase):
|
|
|
|
def test_success(self):
|
|
expected = object()
|
|
opener = StubOpener(expected)
|
|
schemadir = os.path.join('x', 'y', 'z', '')
|
|
metafile, filename = open_metadata(schemadir + 'schema.json',
|
|
_open=opener.open)
|
|
|
|
self.assertIs(metafile, expected)
|
|
self.assertEqual(filename, schemadir + 'UPSTREAM')
|
|
|
|
def test_file_missing(self):
|
|
metafile = None
|
|
opener = StubOpener(metafile)
|
|
|
|
with self.assertRaises(MetadataError):
|
|
open_metadata('schema.json', _open=opener.open)
|
|
|
|
|
|
class ReadMetadataTests(unittest.TestCase):
|
|
|
|
def test_success(self):
|
|
metafile = io.StringIO(dedent("""
|
|
upstream: https://x.y.z/schema.json
|
|
revision: abcdef0123456789
|
|
checksum: deadbeefdeadbeefdeadbeefdeadbeef
|
|
downloaded: 2018-01-09 13:10:59 (UTC)
|
|
"""))
|
|
opener = StubOpener(metafile)
|
|
schemadir = os.path.join('x', 'y', 'z', '')
|
|
meta, filename = read_metadata(schemadir + 'schema.json',
|
|
_open=opener.open)
|
|
|
|
self.assertEqual(meta,
|
|
Metadata('https://x.y.z/schema.json',
|
|
'abcdef0123456789',
|
|
'deadbeefdeadbeefdeadbeefdeadbeef',
|
|
datetime(2018, 1, 9, 13, 10, 59),
|
|
))
|
|
self.assertEqual(filename, schemadir + 'UPSTREAM')
|
|
|
|
def test_file_missing(self):
|
|
metafile = None
|
|
opener = StubOpener(metafile)
|
|
|
|
with self.assertRaises(MetadataError):
|
|
read_metadata('schema.json', _open=opener.open)
|
|
|
|
def test_file_invalid(self):
|
|
metafile = io.StringIO('<bogus>')
|
|
opener = StubOpener(metafile)
|
|
|
|
with self.assertRaises(MetadataError):
|
|
read_metadata('schema.json', _open=opener.open)
|
|
|
|
|
|
class MetadataTests(unittest.TestCase):
|
|
|
|
def test_parse_minimal(self):
|
|
expected = Metadata('https://x.y.z/schema.json',
|
|
'abcdef0123456789',
|
|
'deadbeefdeadbeefdeadbeefdeadbeef',
|
|
datetime(2018, 1, 9, 13, 10, 59),
|
|
)
|
|
meta = Metadata.parse(dedent("""
|
|
upstream: https://x.y.z/schema.json
|
|
revision: abcdef0123456789
|
|
checksum: deadbeefdeadbeefdeadbeefdeadbeef
|
|
downloaded: 2018-01-09 13:10:59 (UTC)
|
|
"""))
|
|
|
|
self.assertEqual(meta, expected)
|
|
|
|
def test_parse_with_whitespace_and_comments(self):
|
|
expected = Metadata('https://x.y.z/schema.json',
|
|
'abcdef0123456789',
|
|
'deadbeefdeadbeefdeadbeefdeadbeef',
|
|
datetime(2018, 1, 9, 13, 10, 59),
|
|
)
|
|
meta = Metadata.parse(dedent("""
|
|
|
|
# generated by x.y.z
|
|
upstream: https://x.y.z/schema.json
|
|
|
|
revision: abcdef0123456789
|
|
checksum: deadbeefdeadbeefdeadbeefdeadbeef
|
|
downloaded: 2018-01-09 13:10:59 (UTC)
|
|
|
|
# done!
|
|
|
|
""")) # noqa
|
|
|
|
self.assertEqual(meta, expected)
|
|
|
|
def test_parse_roundtrip_from_object(self):
|
|
orig = Metadata('https://x.y.z/schema.json',
|
|
'abcdef0123456789',
|
|
'deadbeefdeadbeefdeadbeefdeadbeef',
|
|
datetime(2018, 1, 9, 13, 10, 59),
|
|
)
|
|
meta = Metadata.parse(
|
|
orig.format())
|
|
|
|
self.assertEqual(meta, orig)
|
|
|
|
def test_parse_roundtrip_from_string(self):
|
|
orig = dedent("""\
|
|
upstream: https://x.y.z/schema.json
|
|
revision: abcdef0123456789
|
|
checksum: deadbeefdeadbeefdeadbeefdeadbeef
|
|
downloaded: 2018-01-09 13:10:59 (UTC)
|
|
""")
|
|
data = (Metadata.parse(orig)
|
|
).format()
|
|
|
|
self.assertEqual(data, orig)
|
|
|
|
def test_coercion_noop(self):
|
|
meta = Metadata('https://x.y.z/schema.json',
|
|
'abcdef0123456789',
|
|
'deadbeefdeadbeefdeadbeefdeadbeef',
|
|
datetime(2018, 1, 9, 13, 10, 59),
|
|
)
|
|
|
|
self.assertEqual(meta, (
|
|
'https://x.y.z/schema.json',
|
|
'abcdef0123456789',
|
|
'deadbeefdeadbeefdeadbeefdeadbeef',
|
|
datetime(2018, 1, 9, 13, 10, 59),
|
|
))
|
|
|
|
def test_coercion_change_all(self):
|
|
meta = Metadata(Stringlike('https://x.y.z/schema.json'),
|
|
Hash('abcdef0123456789'),
|
|
Hash('deadbeefdeadbeefdeadbeefdeadbeef'),
|
|
'2018-01-09 13:10:59 (UTC)',
|
|
)
|
|
|
|
self.assertEqual(meta, (
|
|
'https://x.y.z/schema.json',
|
|
'abcdef0123456789',
|
|
'deadbeefdeadbeefdeadbeefdeadbeef',
|
|
datetime(2018, 1, 9, 13, 10, 59),
|
|
))
|
|
|
|
def test_validation_fail(self):
|
|
baseargs = [
|
|
'https://x.y.z/schema.json',
|
|
'abcdef0123456789',
|
|
'deadbeefdeadbeefdeadbeefdeadbeef',
|
|
datetime(2018, 1, 9, 13, 10, 59),
|
|
]
|
|
for i in range(len(baseargs)):
|
|
with self.subTest(baseargs[i]):
|
|
args = list(baseargs)
|
|
args[i] = ''
|
|
with self.assertRaises(ValueError):
|
|
Metadata(*args)
|
|
|
|
def test_url(self):
|
|
meta = Metadata(UPSTREAM,
|
|
'abcdef0123456789',
|
|
'deadbeefdeadbeefdeadbeefdeadbeef',
|
|
datetime(2018, 1, 9, 13, 10, 59),
|
|
)
|
|
url = meta.url
|
|
|
|
self.assertEqual(url, 'https://github.com/Microsoft/vscode-debugadapter-node/raw/abcdef0123456789/debugProtocol.json') # noqa
|
|
|
|
def test_format(self):
|
|
meta = Metadata('https://x.y.z/schema.json',
|
|
'abcdef0123456789',
|
|
'deadbeefdeadbeefdeadbeefdeadbeef',
|
|
datetime(2018, 1, 9, 13, 10, 59),
|
|
)
|
|
formatted = meta.format()
|
|
|
|
self.assertEqual(formatted, dedent("""\
|
|
upstream: https://x.y.z/schema.json
|
|
revision: abcdef0123456789
|
|
checksum: deadbeefdeadbeefdeadbeefdeadbeef
|
|
downloaded: 2018-01-09 13:10:59 (UTC)
|
|
"""))
|