Skip to content

Commit 85d9483

Browse files
committed
Python: Add basic aiohttp tests
1 parent ffad65b commit 85d9483

File tree

8 files changed

+186
-0
lines changed

8 files changed

+186
-0
lines changed

python/ql/test/library-tests/frameworks/aiohttp/ConceptsTest.expected

Whitespace-only changes.
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import python
2+
import experimental.meta.ConceptsTest
3+
4+
class DedicatedResponseTest extends HttpServerHttpResponseTest {
5+
DedicatedResponseTest() { file.getShortName() = "response_test.py" }
6+
}
7+
8+
class OtherResponseTest extends HttpServerHttpResponseTest {
9+
OtherResponseTest() { not this instanceof DedicatedResponseTest }
10+
11+
override string getARelevantTag() { result = "HttpResponse" }
12+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
argumentToEnsureNotTaintedNotMarkedAsSpurious
2+
untaintedArgumentToEnsureTaintedNotMarkedAsMissing
3+
failures
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import experimental.meta.InlineTaintTest
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
semmle-extractor-options: --max-import-depth=1 --lang=3

python/ql/test/library-tests/frameworks/aiohttp/response_test.py

Whitespace-only changes.
Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
# Inspired by https://docs.aiohttp.org/en/stable/web_quickstart.html
2+
# and https://docs.aiohttp.org/en/stable/web_quickstart.html#resources-and-routes
3+
4+
from aiohttp import web
5+
6+
7+
app = web.Application()
8+
9+
10+
## ================================= ##
11+
## Ways to specify routes / handlers ##
12+
## ================================= ##
13+
14+
## Using coroutines
15+
if True:
16+
17+
# `app.add_routes` with list
18+
async def foo(request): # $ MISSING: requestHandler
19+
return web.Response(text="foo")
20+
21+
async def foo2(request): # $ MISSING: requestHandler
22+
return web.Response(text="foo2")
23+
24+
async def foo3(request): # $ MISSING: requestHandler
25+
return web.Response(text="foo3")
26+
27+
app.add_routes([
28+
web.get("/foo", foo), # $ MISSING: routeSetup
29+
web.route("*", "/foo2", foo2), # $ MISSING: routeSetup
30+
web.get(path="/foo3", handler=foo3), # $ MISSING: routeSetup
31+
])
32+
33+
34+
# using decorator
35+
routes = web.RouteTableDef()
36+
37+
@routes.get("/bar") # $ MISSING: routeSetup
38+
async def bar(request): # $ MISSING: requestHandler
39+
return web.Response(text="bar")
40+
41+
@routes.route("*", "/bar2") # $ MISSING: routeSetup
42+
async def bar2(request): # $ MISSING: requestHandler
43+
return web.Response(text="bar2")
44+
45+
@routes.get(path="/bar3") # $ MISSING: routeSetup
46+
async def bar3(request): # $ MISSING: requestHandler
47+
return web.Response(text="bar3")
48+
49+
app.add_routes(routes)
50+
51+
52+
# `app.router.add_get` / `app.router.add_route`
53+
async def baz(request): # $ MISSING: requestHandler
54+
return web.Response(text="baz")
55+
56+
app.router.add_get("/baz", baz) # $ MISSING: routeSetup
57+
58+
async def baz2(request): # $ MISSING: requestHandler
59+
return web.Response(text="baz2")
60+
61+
app.router.add_route("*", "/baz2", baz2) # $ MISSING: routeSetup
62+
63+
async def baz3(request): # $ MISSING: requestHandler
64+
return web.Response(text="baz3")
65+
66+
app.router.add_get(path="/baz3", handler=baz3) # $ MISSING: routeSetup
67+
68+
69+
## Using classes / views
70+
if True:
71+
# see https://docs.aiohttp.org/en/stable/web_quickstart.html#organizing-handlers-in-classes
72+
73+
class MyCustomHandlerClass:
74+
75+
async def foo_handler(self, request): # $ MISSING: requestHandler
76+
return web.Response(text="MyCustomHandlerClass.foo")
77+
78+
my_custom_handler = MyCustomHandlerClass()
79+
app.router.add_get("/MyCustomHandlerClass/foo", my_custom_handler.foo_handler) # $ MISSING: routeSetup
80+
81+
# Using `web.View`
82+
# ---------------
83+
84+
# `app.add_routes` with list
85+
class MyWebView1(web.View):
86+
async def get(self): # $ MISSING: requestHandler
87+
return web.Response(text="MyWebView1.get")
88+
89+
app.add_routes([
90+
web.view("/MyWebView1", MyWebView1) # $ MISSING: routeSetup
91+
])
92+
93+
94+
# using decorator
95+
routes = web.RouteTableDef()
96+
97+
@routes.view("/MyWebView2") # $ MISSING: routeSetup
98+
class MyWebView2(web.View):
99+
async def get(self): # $ MISSING: requestHandler
100+
return web.Response(text="MyWebView2.get")
101+
102+
app.add_routes(routes)
103+
104+
105+
# `app.router.add_view`
106+
class MyWebView3(web.View):
107+
async def get(self): # $ MISSING: requestHandler
108+
return web.Response(text="MyWebView3.get")
109+
110+
app.router.add_view("/MyWebView3", MyWebView3) # $ MISSING: routeSetup
111+
112+
## =================== ##
113+
## "Routed parameters" ##
114+
## =================== ##
115+
116+
if True:
117+
# see https://docs.aiohttp.org/en/stable/web_quickstart.html#variable-resources
118+
119+
async def matching(request: web.Request): # $ MISSING: requestHandler
120+
name = request.match_info['name']
121+
number = request.match_info['number']
122+
return web.Response(text="matching name={} number={}".format(name, number))
123+
124+
app.router.add_get("/matching/{name}/{number:\d+}", matching) # $ MISSING: routeSetup
125+
126+
## ======= ##
127+
## subapps ##
128+
## ======= ##
129+
130+
if True:
131+
subapp = web.Application()
132+
133+
async def subapp_handler(request): # $ MISSING: requestHandler
134+
return web.Response(text="subapp_handler")
135+
136+
subapp.router.add_get("/subapp_handler", subapp_handler) # $ MISSING: routeSetup
137+
138+
app.add_subapp("/my_subapp", subapp)
139+
140+
# similar behavior is possible with `app.add_domain`, but since I don't think we'll have special handling
141+
# for any kind of subapps, I have not created a test for this.
142+
143+
144+
## ================================ ##
145+
## Constructing UrlDispatcher first ##
146+
## ================================ ##
147+
148+
if True:
149+
async def manual_dispatcher_instance(request): # $ MISSING: requestHandler
150+
return web.Response(text="manual_dispatcher_instance")
151+
152+
url_dispatcher = web.UrlDispatcher()
153+
url_dispatcher.add_get("/manual_dispatcher_instance", manual_dispatcher_instance) # $ MISSING: routeSetup
154+
155+
subapp2 = web.Application(router=url_dispatcher)
156+
app.add_subapp("/manual_dispatcher_instance_app", subapp2)
157+
158+
159+
## =========== ##
160+
## Run the app ##
161+
## =========== ##
162+
163+
if __name__ == "__main__":
164+
print("For auto-reloading server you can use:")
165+
print(f"aiohttp-devtools runserver {__file__}")
166+
print("after doing `pip install aiohttp-devtools`")
167+
print()
168+
169+
web.run_app(app)

python/ql/test/library-tests/frameworks/aiohttp/taint_test.py

Whitespace-only changes.

0 commit comments

Comments
 (0)