diff --git a/.github/workflows/code-check.yml b/.github/workflows/code-check.yml index b6cf8fd..021b1e4 100644 --- a/.github/workflows/code-check.yml +++ b/.github/workflows/code-check.yml @@ -14,6 +14,10 @@ jobs: check: name: Check Code runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.8", "3.9", "3.10", "3.11"] + fail-fast: false steps: - name: Check out from Git diff --git a/.github/workflows/python-build-test.yml b/.github/workflows/python-build-test.yml index c8a1031..d2be143 100644 --- a/.github/workflows/python-build-test.yml +++ b/.github/workflows/python-build-test.yml @@ -12,10 +12,10 @@ permissions: jobs: build: - - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} strategy: matrix: + os: ['ubuntu-latest', 'macos-latest', 'windows-latest'] python-version: ["3.8", "3.9", "3.10", "3.11"] fail-fast: false @@ -41,6 +41,7 @@ jobs: run: | inv build inv build.mkdocs + build-rust: runs-on: ubuntu-latest strategy: diff --git a/tests/keystore_test.py b/tests/keystore_test.py index 2e73039..2a3d48d 100644 --- a/tests/keystore_test.py +++ b/tests/keystore_test.py @@ -18,6 +18,8 @@ import asyncio import json import logging +import pathlib +import pytest import tempfile import os @@ -83,87 +85,95 @@ JSON3 = """ # ----------------------------------------------------------------------------- -async def test_basic(): - with tempfile.NamedTemporaryFile(mode="r+", encoding='utf-8') as file: - keystore = JsonKeyStore('my_namespace', file.name) +@pytest.fixture +def temporary_file(): + file = tempfile.NamedTemporaryFile(delete=False) + file.close() + yield file.name + pathlib.Path(file.name).unlink() + + +# ----------------------------------------------------------------------------- +async def test_basic(temporary_file): + with open(temporary_file, mode='w', encoding='utf-8') as file: file.write("{}") file.flush() - keys = await keystore.get_all() - assert len(keys) == 0 + keystore = JsonKeyStore('my_namespace', temporary_file) - keys = PairingKeys() - await keystore.update('foo', keys) - foo = await keystore.get('foo') - assert foo is not None - assert foo.ltk is None - ltk = bytes([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]) - keys.ltk = PairingKeys.Key(ltk) - await keystore.update('foo', keys) - foo = await keystore.get('foo') - assert foo is not None - assert foo.ltk is not None - assert foo.ltk.value == ltk + keys = await keystore.get_all() + assert len(keys) == 0 - file.flush() - with open(file.name, "r", encoding="utf-8") as json_file: - json_data = json.load(json_file) - assert 'my_namespace' in json_data - assert 'foo' in json_data['my_namespace'] - assert 'ltk' in json_data['my_namespace']['foo'] + keys = PairingKeys() + await keystore.update('foo', keys) + foo = await keystore.get('foo') + assert foo is not None + assert foo.ltk is None + ltk = bytes([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]) + keys.ltk = PairingKeys.Key(ltk) + await keystore.update('foo', keys) + foo = await keystore.get('foo') + assert foo is not None + assert foo.ltk is not None + assert foo.ltk.value == ltk + + with open(file.name, "r", encoding="utf-8") as json_file: + json_data = json.load(json_file) + assert 'my_namespace' in json_data + assert 'foo' in json_data['my_namespace'] + assert 'ltk' in json_data['my_namespace']['foo'] # ----------------------------------------------------------------------------- -async def test_parsing(): - with tempfile.NamedTemporaryFile(mode="w", encoding='utf-8') as file: - keystore = JsonKeyStore('my_namespace', file.name) +async def test_parsing(temporary_file): + with open(temporary_file, mode='w', encoding='utf-8') as file: file.write(JSON1) file.flush() - foo = await keystore.get('14:7D:DA:4E:53:A8/P') - assert foo is not None - assert foo.ltk.value == bytes.fromhex('d1897ee10016eb1a08e4e037fd54c683') + keystore = JsonKeyStore('my_namespace', file.name) + foo = await keystore.get('14:7D:DA:4E:53:A8/P') + assert foo is not None + assert foo.ltk.value == bytes.fromhex('d1897ee10016eb1a08e4e037fd54c683') # ----------------------------------------------------------------------------- -async def test_default_namespace(): - with tempfile.NamedTemporaryFile(mode="w", encoding='utf-8') as file: - keystore = JsonKeyStore(None, file.name) +async def test_default_namespace(temporary_file): + with open(temporary_file, mode='w', encoding='utf-8') as file: file.write(JSON1) file.flush() - all_keys = await keystore.get_all() - assert len(all_keys) == 1 - name, keys = all_keys[0] - assert name == '14:7D:DA:4E:53:A8/P' - assert keys.irk.value == bytes.fromhex('e7b2543b206e4e46b44f9e51dad22bd1') + keystore = JsonKeyStore(None, file.name) + all_keys = await keystore.get_all() + assert len(all_keys) == 1 + name, keys = all_keys[0] + assert name == '14:7D:DA:4E:53:A8/P' + assert keys.irk.value == bytes.fromhex('e7b2543b206e4e46b44f9e51dad22bd1') - with tempfile.NamedTemporaryFile(mode="w", encoding='utf-8') as file: - keystore = JsonKeyStore(None, file.name) + with open(temporary_file, mode='w', encoding='utf-8') as file: file.write(JSON2) file.flush() - keys = PairingKeys() - ltk = bytes([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]) - keys.ltk = PairingKeys.Key(ltk) - await keystore.update('foo', keys) - file.flush() - with open(file.name, "r", encoding="utf-8") as json_file: - json_data = json.load(json_file) - assert '__DEFAULT__' in json_data - assert 'foo' in json_data['__DEFAULT__'] - assert 'ltk' in json_data['__DEFAULT__']['foo'] + keystore = JsonKeyStore(None, file.name) + keys = PairingKeys() + ltk = bytes([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]) + keys.ltk = PairingKeys.Key(ltk) + await keystore.update('foo', keys) + with open(file.name, "r", encoding="utf-8") as json_file: + json_data = json.load(json_file) + assert '__DEFAULT__' in json_data + assert 'foo' in json_data['__DEFAULT__'] + assert 'ltk' in json_data['__DEFAULT__']['foo'] - with tempfile.NamedTemporaryFile(mode="w", encoding='utf-8') as file: - keystore = JsonKeyStore(None, file.name) + with open(temporary_file, mode='w', encoding='utf-8') as file: file.write(JSON3) file.flush() - all_keys = await keystore.get_all() - assert len(all_keys) == 1 - name, keys = all_keys[0] - assert name == '14:7D:DA:4E:53:A8/P' - assert keys.irk.value == bytes.fromhex('e7b2543b206e4e46b44f9e51dad22bd1') + keystore = JsonKeyStore(None, file.name) + all_keys = await keystore.get_all() + assert len(all_keys) == 1 + name, keys = all_keys[0] + assert name == '14:7D:DA:4E:53:A8/P' + assert keys.irk.value == bytes.fromhex('e7b2543b206e4e46b44f9e51dad22bd1') # -----------------------------------------------------------------------------