feat: context managers in ServiceBrowser and AsyncServiceBrowser (#1233) · python-zeroconf/python-zeroconf@bd8d846

Original file line numberDiff line numberDiff line change

@@ -3,13 +3,14 @@

33
44

""" Unit tests for zeroconf._services.browser. """

55
6+

import asyncio

67

import logging

78

import os

89

import socket

910

import time

1011

import unittest

1112

from threading import Event

12-

from typing import Iterable, Set

13+

from typing import Iterable, Set, cast

1314

from unittest.mock import patch

1415
1516

import pytest

@@ -75,6 +76,35 @@ class MyServiceListener(r.ServiceListener):

7576

zc.close()

7677
7778
79+

def test_service_browser_cancel_context_manager():

80+

"""Test we can cancel a ServiceBrowser with it being used as a context manager."""

81+
82+

# instantiate a zeroconf instance

83+

zc = Zeroconf(interfaces=['127.0.0.1'])

84+

# start a browser

85+

type_ = "_hap._tcp.local."

86+
87+

class MyServiceListener(r.ServiceListener):

88+

pass

89+
90+

listener = MyServiceListener()

91+
92+

browser = r.ServiceBrowser(zc, type_, None, listener)

93+
94+

assert cast(bool, browser.done) is False

95+
96+

with browser:

97+

pass

98+
99+

# ensure call_soon_threadsafe in ServiceBrowser.cancel is run

100+

assert zc.loop is not None

101+

asyncio.run_coroutine_threadsafe(asyncio.sleep(0), zc.loop).result()

102+
103+

assert cast(bool, browser.done) is True

104+
105+

zc.close()

106+
107+
78108

def test_service_browser_cancel_multiple_times_after_close():

79109

"""Test we can cancel a ServiceBrowser multiple times after close."""

80110