Skip to content

Commit ce5225c

Browse files
[PR #9939/509fddfd backport][3.11] Fix test_resolve_gitapi_subapps benchmark (#9949)
Co-authored-by: Andrew Svetlov <[email protected]>
1 parent b8367c9 commit ce5225c

File tree

1 file changed

+120
-28
lines changed

1 file changed

+120
-28
lines changed

tests/test_benchmarks_web_urldispatcher.py

Lines changed: 120 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import random
77
import string
88
from pathlib import Path
9-
from typing import NoReturn
9+
from typing import NoReturn, Optional
1010
from unittest import mock
1111

1212
from multidict import CIMultiDict, CIMultiDictProxy
@@ -53,9 +53,16 @@ async def handler(request: web.Request) -> NoReturn:
5353
router = app.router
5454
request = _mock_request(method="GET", path="/")
5555

56-
async def run_url_dispatcher_benchmark() -> None:
56+
async def run_url_dispatcher_benchmark() -> Optional[web.UrlMappingMatchInfo]:
57+
ret = None
5758
for _ in range(resolve_count):
58-
await router.resolve(request)
59+
ret = await router.resolve(request)
60+
61+
return ret
62+
63+
ret = loop.run_until_complete(run_url_dispatcher_benchmark())
64+
assert ret is not None
65+
assert ret.get_info()["path"] == "/", ret.get_info()
5966

6067
@benchmark
6168
def _run() -> None:
@@ -70,14 +77,22 @@ def test_resolve_static_root_route(
7077
resolve_count = 100
7178

7279
app = web.Application()
73-
app.router.add_static("/", pathlib.Path(aiohttp.__file__).parent)
80+
here = pathlib.Path(aiohttp.__file__).parent
81+
app.router.add_static("/", here)
7482
app.freeze()
7583
router = app.router
7684
request = _mock_request(method="GET", path="/")
7785

78-
async def run_url_dispatcher_benchmark() -> None:
86+
async def run_url_dispatcher_benchmark() -> Optional[web.UrlMappingMatchInfo]:
87+
ret = None
7988
for _ in range(resolve_count):
80-
await router.resolve(request)
89+
ret = await router.resolve(request)
90+
91+
return ret
92+
93+
ret = loop.run_until_complete(run_url_dispatcher_benchmark())
94+
assert ret is not None
95+
assert ret.get_info()["directory"] == here, ret.get_info()
8196

8297
@benchmark
8398
def _run() -> None:
@@ -101,9 +116,16 @@ async def handler(request: web.Request) -> NoReturn:
101116
router = app.router
102117
request = _mock_request(method="GET", path="/api/server/dispatch/1/update")
103118

104-
async def run_url_dispatcher_benchmark() -> None:
119+
async def run_url_dispatcher_benchmark() -> Optional[web.UrlMappingMatchInfo]:
120+
ret = None
105121
for _ in range(resolve_count):
106-
await router.resolve(request)
122+
ret = await router.resolve(request)
123+
124+
return ret
125+
126+
ret = loop.run_until_complete(run_url_dispatcher_benchmark())
127+
assert ret is not None
128+
assert ret.get_info()["path"] == "/api/server/dispatch/1/update", ret.get_info()
107129

108130
@benchmark
109131
def _run() -> None:
@@ -130,9 +152,15 @@ async def handler(request: web.Request) -> NoReturn:
130152
for count in range(250)
131153
]
132154

133-
async def run_url_dispatcher_benchmark() -> None:
155+
async def run_url_dispatcher_benchmark() -> Optional[web.UrlMappingMatchInfo]:
156+
ret = None
134157
for request in requests:
135-
await router.resolve(request)
158+
ret = await router.resolve(request)
159+
return ret
160+
161+
ret = loop.run_until_complete(run_url_dispatcher_benchmark())
162+
assert ret is not None
163+
assert ret.get_info()["path"] == "/api/server/dispatch/249/update", ret.get_info()
136164

137165
@benchmark
138166
def _run() -> None:
@@ -162,11 +190,18 @@ async def handler(request: web.Request) -> NoReturn:
162190
app.freeze()
163191
router = app.router
164192

165-
requests = [_mock_request(method="GET", path=url) for url in urls]
193+
requests = [(_mock_request(method="GET", path=url), url) for url in urls]
166194

167-
async def run_url_dispatcher_benchmark() -> None:
168-
for request in requests:
169-
await router.resolve(request)
195+
async def run_url_dispatcher_benchmark() -> Optional[web.UrlMappingMatchInfo]:
196+
ret = None
197+
for request, path in requests:
198+
ret = await router.resolve(request)
199+
200+
return ret
201+
202+
ret = loop.run_until_complete(run_url_dispatcher_benchmark())
203+
assert ret is not None
204+
assert ret.get_info()["path"] == url, ret.get_info()
170205

171206
@benchmark
172207
def _run() -> None:
@@ -194,9 +229,18 @@ async def handler(request: web.Request) -> NoReturn:
194229
for customer in range(250)
195230
]
196231

197-
async def run_url_dispatcher_benchmark() -> None:
232+
async def run_url_dispatcher_benchmark() -> Optional[web.UrlMappingMatchInfo]:
233+
ret = None
198234
for request in requests:
199-
await router.resolve(request)
235+
ret = await router.resolve(request)
236+
237+
return ret
238+
239+
ret = loop.run_until_complete(run_url_dispatcher_benchmark())
240+
assert ret is not None
241+
assert (
242+
ret.get_info()["formatter"] == "/api/server/dispatch/{customer}/update"
243+
), ret.get_info()
200244

201245
@benchmark
202246
def _run() -> None:
@@ -226,9 +270,18 @@ async def handler(request: web.Request) -> NoReturn:
226270
for customer in range(250)
227271
]
228272

229-
async def run_url_dispatcher_benchmark() -> None:
273+
async def run_url_dispatcher_benchmark() -> Optional[web.UrlMappingMatchInfo]:
274+
ret = None
230275
for request in requests:
231-
await router.resolve(request)
276+
ret = await router.resolve(request)
277+
278+
return ret
279+
280+
ret = loop.run_until_complete(run_url_dispatcher_benchmark())
281+
assert ret is not None
282+
assert (
283+
ret.get_info()["formatter"] == "/api/server/dispatch/{customer}/update"
284+
), ret.get_info()
232285

233286
@benchmark
234287
def _run() -> None:
@@ -256,9 +309,16 @@ async def handler(request: web.Request) -> NoReturn:
256309
for customer in range(250)
257310
]
258311

259-
async def run_url_dispatcher_benchmark() -> None:
312+
async def run_url_dispatcher_benchmark() -> Optional[web.UrlMappingMatchInfo]:
313+
ret = None
260314
for request in requests:
261-
await router.resolve(request)
315+
ret = await router.resolve(request)
316+
317+
return ret
318+
319+
ret = loop.run_until_complete(run_url_dispatcher_benchmark())
320+
assert ret is not None
321+
assert ret.get_info()["formatter"] == "/api/{customer}/update", ret.get_info()
262322

263323
@benchmark
264324
def _run() -> None:
@@ -306,9 +366,18 @@ async def handler(request: web.Request) -> NoReturn:
306366
)
307367
)
308368

309-
async def run_url_dispatcher_benchmark() -> None:
369+
async def run_url_dispatcher_benchmark() -> Optional[web.UrlMappingMatchInfo]:
370+
ret = None
310371
for request in requests:
311-
await router.resolve(request)
372+
ret = await router.resolve(request)
373+
return ret
374+
375+
ret = loop.run_until_complete(run_url_dispatcher_benchmark())
376+
assert ret is not None
377+
assert (
378+
ret.get_info()["formatter"]
379+
== "/repos/{owner}/{repo}/pulls/{pull_number}/reviews"
380+
), ret.get_info()
312381

313382
@benchmark
314383
def _run() -> None:
@@ -346,8 +415,14 @@ async def handler(request: web.Request) -> NoReturn:
346415
app = web.Application()
347416
for url in urls:
348417
parts = url.split("/")
349-
subapp = subapps.get(parts[1], app)
350-
subapp.router.add_get(url, handler)
418+
subapp = subapps.get(parts[1])
419+
if subapp is not None:
420+
sub_url = "/".join([""] + parts[2:])
421+
if not sub_url:
422+
sub_url = "/"
423+
subapp.router.add_get(sub_url, handler)
424+
else:
425+
app.router.add_get(url, handler)
351426
for key, subapp in subapps.items():
352427
app.add_subapp("/" + key, subapp)
353428
app.freeze()
@@ -370,9 +445,18 @@ async def handler(request: web.Request) -> NoReturn:
370445
)
371446
)
372447

373-
async def run_url_dispatcher_benchmark() -> None:
448+
async def run_url_dispatcher_benchmark() -> Optional[web.UrlMappingMatchInfo]:
449+
ret = None
374450
for request in requests:
375-
await router.resolve(request)
451+
ret = await router.resolve(request)
452+
return ret
453+
454+
ret = loop.run_until_complete(run_url_dispatcher_benchmark())
455+
assert ret is not None
456+
assert (
457+
ret.get_info()["formatter"]
458+
== "/repos/{owner}/{repo}/pulls/{pull_number}/reviews"
459+
), ret.get_info()
376460

377461
@benchmark
378462
def _run() -> None:
@@ -404,9 +488,17 @@ async def handler(request: web.Request) -> NoReturn:
404488
for customer in range(250)
405489
]
406490

407-
async def run_url_dispatcher_benchmark() -> None:
491+
async def run_url_dispatcher_benchmark() -> Optional[web.UrlMappingMatchInfo]:
492+
ret = None
408493
for request in requests:
409-
await router.resolve(request)
494+
ret = await router.resolve(request)
495+
return ret
496+
497+
ret = loop.run_until_complete(run_url_dispatcher_benchmark())
498+
assert ret is not None
499+
assert (
500+
ret.get_info()["path"] == "/api/path/to/plugin/249/deep/enough/sub/path"
501+
), ret.get_info()
410502

411503
@benchmark
412504
def _run() -> None:

0 commit comments

Comments
 (0)