Skip to content

Commit b776bee

Browse files
authored
Test infra improvements (#461)
* Add pytest and loosen versions * Cache strategy * debug code * remove extra import * no handle.exe on gha * resilient cache tests * initial sleep * weakref finalize instead of __del__ * delay on write check * remove debug code * remove merge cruft * Revert "weakref finalize instead of __del__" This reverts commit 197a058. * save time by reducing sleep * gcs retry
1 parent 40e205d commit b776bee

File tree

6 files changed

+46
-13
lines changed

6 files changed

+46
-13
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ coverage.xml
5959
*.cover
6060
.hypothesis/
6161
.pytest_cache/
62+
reportlog.jsonl
6263

6364
# Translations
6465
*.mo

Makefile

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,5 +86,8 @@ test-debug: ## rerun tests that failed in last run and stop with pdb at failure
8686
test-live-cloud: ## run tests on live cloud backends
8787
USE_LIVE_CLOUD=1 python -m pytest -vv
8888

89+
test-time-report:
90+
pytest-duration-insights explore --no-trim reportlog.jsonl
91+
8992
perf: ## run performance measurement suite for s3 and save results to perf-results.csv
9093
python tests/performance/cli.py s3 --save-csv=perf-results.csv

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ ignore_missing_imports = true
6565

6666
[tool.pytest.ini_options]
6767
minversion = "6.0"
68-
addopts = "--cov=cloudpathlib --cov-report=term --cov-report=html --cov-report=xml -n=auto"
68+
addopts = "--cov=cloudpathlib --cov-report=term --cov-report=html --cov-report=xml -n=auto --report-log reportlog.jsonl"
6969
testpaths = ["tests"]
7070

7171
[tool.coverage.run]

requirements-dev.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ pandas
1919
pillow
2020
psutil
2121
pydantic
22-
pytest<8
23-
pytest-cases>=3.7.0
22+
pytest
23+
pytest-cases
2424
pytest-cov
25+
pytest-duration-insights
26+
pytest-reportlog
2527
pytest-xdist
2628
python-dotenv
2729
pywin32; sys_platform == 'win32'

tests/test_caching.py

Lines changed: 35 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,14 @@
33
from time import sleep
44
from pathlib import Path
55

6+
from google.api_core.exceptions import TooManyRequests
67
import pytest
7-
from tenacity import retry, retry_if_exception_type, stop_after_attempt, wait_random_exponential
8+
from tenacity import (
9+
retry,
10+
retry_if_exception_type,
11+
stop_after_attempt,
12+
wait_random_exponential,
13+
)
814

915
from cloudpathlib.enums import FileCacheMode
1016
from cloudpathlib.exceptions import (
@@ -433,17 +439,38 @@ def test_environment_variables_force_overwrite_to(rig: CloudProviderTestRig, tmp
433439
assert p.stat().st_mtime >= new_local.stat().st_mtime
434440

435441
# would raise if not set
436-
sleep(1.01) # give time so not equal when rounded
437-
p._upload_file_to_cloud(new_local)
438-
assert p.stat().st_mtime > orig_cloud_mod_time # cloud now overwritten
442+
@retry(
443+
retry=retry_if_exception_type((AssertionError, TooManyRequests)),
444+
wait=wait_random_exponential(multiplier=0.5, max=5),
445+
stop=stop_after_attempt(10),
446+
reraise=True,
447+
)
448+
def _wait_for_cloud_newer():
449+
p._upload_file_to_cloud(new_local)
450+
assert p.stat().st_mtime > orig_cloud_mod_time # cloud now overwritten
451+
452+
_wait_for_cloud_newer()
439453

440454
new_also_cloud = rig.create_cloud_path("dir_0/another_cloud_file.txt")
441-
sleep(1.01) # give time so not equal when rounded
442-
new_also_cloud.write_text("newer")
443455

444-
new_cloud_mod_time = new_also_cloud.stat().st_mtime
456+
sleep(0.1) # at least a little different
457+
458+
@retry(
459+
retry=retry_if_exception_type(
460+
(OverwriteNewerLocalError, AssertionError, TooManyRequests)
461+
),
462+
wait=wait_random_exponential(multiplier=0.5, max=5),
463+
stop=stop_after_attempt(10),
464+
reraise=True,
465+
)
466+
def _retry_write_until_old_enough():
467+
new_also_cloud.write_text("newer")
468+
new_cloud_mod_time = new_also_cloud.stat().st_mtime
469+
assert p.stat().st_mtime < new_cloud_mod_time # would raise if not set
470+
return new_cloud_mod_time
471+
472+
new_cloud_mod_time = _retry_write_until_old_enough()
445473

446-
assert p.stat().st_mtime < new_cloud_mod_time # would raise if not set
447474
p.copy(new_also_cloud)
448475
assert new_also_cloud.stat().st_mtime >= new_cloud_mod_time
449476

tests/test_cloudpath_upload_copy.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def test_upload_from_file(rig, upload_assets_dir):
5757

5858
# to file, file exists
5959
to_upload_2 = upload_assets_dir / "upload_2.txt"
60-
sleep(1.5)
60+
sleep(1.1)
6161
to_upload_2.touch() # make sure local is newer
6262
p.upload_from(to_upload_2)
6363
assert p.exists()
@@ -70,7 +70,7 @@ def test_upload_from_file(rig, upload_assets_dir):
7070

7171
# to file, file exists and is newer; overwrite
7272
p.touch()
73-
sleep(1.5)
73+
sleep(1.1)
7474
p.upload_from(upload_assets_dir / "upload_1.txt", force_overwrite_to_cloud=True)
7575
assert p.exists()
7676
assert p.read_text() == "Hello from 1"

0 commit comments

Comments
 (0)