Skip to content

Commit 48f27cf

Browse files
committed
Run resource sensititve tests alone on Mac
Add extra wait buffer to flaky test sensitive to timing issues Properly consume first `SystemInfoEvent` in fixture to ensure no interference with tests
1 parent de3a0d2 commit 48f27cf

File tree

6 files changed

+34
-3
lines changed

6 files changed

+34
-3
lines changed

tests/unit/_autoscaling/test_snapshotter.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from __future__ import annotations
22

3+
import asyncio
34
from datetime import datetime, timedelta, timezone
45
from logging import getLogger
56
from typing import TYPE_CHECKING, cast
@@ -16,15 +17,30 @@
1617
from crawlee.configuration import Configuration
1718
from crawlee.events import LocalEventManager
1819
from crawlee.events._types import Event, EventSystemInfoData
20+
from tests.unit.utils import run_alone_on_mac
1921

2022
if TYPE_CHECKING:
2123
from collections.abc import AsyncGenerator
2224

2325

2426
@pytest.fixture
2527
async def event_manager() -> AsyncGenerator[LocalEventManager, None]:
26-
# Use a long interval to avoid interference from periodic system info events during tests
27-
async with LocalEventManager(system_info_interval=timedelta(hours=9999)) as event_manager:
28+
# Use a long interval to avoid interference from periodic system info events during tests and ensure the first
29+
# automatic event is consumed before yielding.
30+
31+
event_manager = LocalEventManager(system_info_interval=timedelta(hours=9999))
32+
33+
initial_system_info_consumed = asyncio.Event()
34+
35+
async def consume_automatic_system_info(_: EventSystemInfoData) -> None:
36+
initial_system_info_consumed.set()
37+
38+
event_manager.on(event=Event.SYSTEM_INFO, listener=consume_automatic_system_info)
39+
40+
async with event_manager:
41+
await initial_system_info_consumed.wait()
42+
event_manager.off(event=Event.SYSTEM_INFO, listener=consume_automatic_system_info)
43+
2844
yield event_manager
2945

3046

@@ -65,6 +81,7 @@ async def test_start_stop_lifecycle() -> None:
6581
pass
6682

6783

84+
@run_alone_on_mac
6885
async def test_snapshot_cpu(
6986
snapshotter: Snapshotter, event_system_data_info: EventSystemInfoData, event_manager: LocalEventManager
7087
) -> None:
@@ -197,6 +214,7 @@ async def test_methods_raise_error_when_not_active() -> None:
197214
assert snapshotter.active is True
198215

199216

217+
@run_alone_on_mac
200218
async def test_snapshot_pruning_removes_outdated_records(
201219
snapshotter: Snapshotter, event_manager: LocalEventManager, default_memory_info: MemoryInfo
202220
) -> None:

tests/unit/_utils/test_recurring_task.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import pytest
88

99
from crawlee._utils.recurring_task import RecurringTask
10+
from tests.unit.utils import run_alone_on_mac
1011

1112

1213
@pytest.fixture
@@ -41,6 +42,7 @@ async def test_start_and_stop(function: AsyncMock, delay: timedelta) -> None:
4142
assert rt.task.done()
4243

4344

45+
@run_alone_on_mac
4446
async def test_execution(function: AsyncMock, delay: timedelta) -> None:
4547
task = RecurringTask(function, delay)
4648

tests/unit/browsers/test_browser_pool.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import pytest
66

77
from crawlee.browsers import BrowserPool, PlaywrightBrowserPlugin
8+
from tests.unit.utils import run_alone_on_mac
89

910
if TYPE_CHECKING:
1011
from yarl import URL
@@ -92,6 +93,7 @@ async def test_new_page_with_each_plugin(server_url: URL) -> None:
9293
assert browser_pool.total_pages_count == 2
9394

9495

96+
@run_alone_on_mac
9597
async def test_with_default_plugin_constructor(server_url: URL) -> None:
9698
async with BrowserPool.with_default_plugin(headless=True, browser_type='firefox') as browser_pool:
9799
assert len(browser_pool.plugins) == 1

tests/unit/crawlers/_basic/test_basic_crawler.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1373,6 +1373,7 @@ async def test_timeout_in_handler(sleep_type: str) -> None:
13731373
# Test is skipped in older Python versions.
13741374
from asyncio import timeout # type:ignore[attr-defined] # noqa: PLC0415
13751375

1376+
non_realtime_system_coefficient = 2
13761377
handler_timeout = timedelta(seconds=1)
13771378
max_request_retries = 3
13781379
double_handler_timeout_s = handler_timeout.total_seconds() * 2
@@ -1401,7 +1402,7 @@ async def handler(context: BasicCrawlingContext) -> None:
14011402

14021403
# Timeout in pytest, because previous implementation would run crawler until following:
14031404
# "The request queue seems to be stuck for 300.0s, resetting internal state."
1404-
async with timeout(max_request_retries * double_handler_timeout_s):
1405+
async with timeout(max_request_retries * double_handler_timeout_s * non_realtime_system_coefficient):
14051406
await crawler.run(['https://a.placeholder.com'])
14061407

14071408
assert crawler.statistics.state.requests_finished == 1

tests/unit/request_loaders/test_sitemap_request_loader.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from crawlee.http_clients._base import HttpClient
99
from crawlee.request_loaders._sitemap_request_loader import SitemapRequestLoader
1010
from crawlee.storages import KeyValueStore
11+
from tests.unit.utils import run_alone_on_mac
1112

1213
BASIC_SITEMAP = """
1314
<?xml version="1.0" encoding="UTF-8"?>
@@ -50,6 +51,7 @@ def encode_base64(data: bytes) -> str:
5051
return base64.b64encode(data).decode('utf-8')
5152

5253

54+
@run_alone_on_mac
5355
async def test_sitemap_traversal(server_url: URL, http_client: HttpClient) -> None:
5456
sitemap_url = (server_url / 'sitemap.xml').with_query(base64=encode_base64(BASIC_SITEMAP.encode()))
5557
sitemap_loader = SitemapRequestLoader([str(sitemap_url)], http_client=http_client)
@@ -66,6 +68,7 @@ async def test_sitemap_traversal(server_url: URL, http_client: HttpClient) -> No
6668
assert await sitemap_loader.get_handled_count() == 5
6769

6870

71+
@run_alone_on_mac
6972
async def test_is_empty_does_not_depend_on_fetch_next_request(server_url: URL, http_client: HttpClient) -> None:
7073
sitemap_url = (server_url / 'sitemap.xml').with_query(base64=encode_base64(BASIC_SITEMAP.encode()))
7174
sitemap_loader = SitemapRequestLoader([str(sitemap_url)], http_client=http_client)

tests/unit/utils.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import sys
2+
3+
import pytest
4+
5+
run_alone_on_mac = pytest.mark.run_alone if sys.platform == 'darwin' else lambda x: x

0 commit comments

Comments
 (0)