File: test_utils.py

package info (click to toggle)
bleak 2.1.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,076 kB
  • sloc: python: 11,282; makefile: 165; java: 105
file content (94 lines) | stat: -rw-r--r-- 2,341 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/usr/bin/env python

"""Tests for `bleak.backends.winrt.util` package."""

import sys

import pytest

if sys.platform != "win32":
    pytest.skip("skipping windows-only tests", allow_module_level=True)
    # HACK: work around pyright bug
    allow_sta: object

from ctypes import windll, wintypes  # type: ignore[attr-defined]

from bleak.backends.winrt.util import (
    allow_sta,
    assert_mta,
    check_hresult,
    uninitialize_sta,
)
from bleak.exc import BleakError

# https://learn.microsoft.com/en-us/windows/win32/api/objbase/ne-objbase-coinit
COINIT_MULTITHREADED = 0x0
COINIT_APARTMENTTHREADED = 0x2

# https://learn.microsoft.com/en-us/windows/win32/api/combaseapi/nf-combaseapi-coinitializeex
_CoInitializeEx = windll.ole32.CoInitializeEx
_CoInitializeEx.restype = wintypes.LONG
_CoInitializeEx.argtypes = [wintypes.LPVOID, wintypes.DWORD]
_CoInitializeEx.errcheck = check_hresult  # type: ignore[assignment]

# https://learn.microsoft.com/en-us/windows/win32/api/combaseapi/nf-combaseapi-couninitialize
_CoUninitialize = windll.ole32.CoUninitialize
_CoUninitialize.restype = None
_CoUninitialize.argtypes = []


@pytest.fixture(autouse=True)
def run_around_tests():
    # reset global state
    try:
        delattr(allow_sta, "_allowed")
    except AttributeError:
        pass

    yield


@pytest.mark.asyncio
async def test_assert_mta_no_init():
    """Test device_path_from_characteristic_path."""

    await assert_mta()


@pytest.mark.asyncio
async def test_assert_mta_init_mta():
    """Test device_path_from_characteristic_path."""

    _CoInitializeEx(None, COINIT_MULTITHREADED)

    try:
        await assert_mta()
        assert hasattr(allow_sta, "_allowed")
    finally:
        _CoUninitialize()


@pytest.mark.asyncio
async def test_assert_mta_init_sta():
    """Test device_path_from_characteristic_path."""

    _CoInitializeEx(None, COINIT_APARTMENTTHREADED)

    try:
        with pytest.raises(
            BleakError,
            match="Thread is configured for Windows GUI but callbacks are not working.",
        ):
            await assert_mta()
    finally:
        _CoUninitialize()


@pytest.mark.asyncio
async def test_uninitialize_sta():
    """Test device_path_from_characteristic_path."""

    _CoInitializeEx(None, COINIT_APARTMENTTHREADED)
    uninitialize_sta()

    await assert_mta()