Skip to content

Commit 697b36c

Browse files
authored
Validate response status codes (#9605)
This checks that the status code of the response is a 200. It also makes sure the headers are verified for the query and update tests.
1 parent b08578a commit 697b36c

File tree

9 files changed

+53
-21
lines changed

9 files changed

+53
-21
lines changed

toolset/test_types/abstract_test_type.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ def __init__(self,
2828
self.args = args
2929
self.headers = ""
3030
self.body = ""
31+
self.status = None
3132

3233
if accept_header is None:
3334
self.accept_header = self.accept('json')
@@ -64,7 +65,7 @@ def parse(self, test_keys):
6465
"A %s requires the benchmark_config.json to contain %s" %
6566
(self.name, self.args))
6667

67-
def request_headers_and_body(self, url):
68+
def request_headers_and_body_and_status(self, url):
6869
'''
6970
Downloads a URL and returns the HTTP response headers
7071
and body content as a tuple
@@ -76,7 +77,8 @@ def request_headers_and_body(self, url):
7677

7778
self.headers = r.headers
7879
self.body = r.content
79-
return self.headers, self.body
80+
self.status = r.status_code
81+
return self.headers, self.body, self.status
8082

8183
def output_headers_and_body(self):
8284
log(str(self.headers))

toolset/test_types/cached-query/cached-query.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from toolset.test_types.abstract_test_type import AbstractTestType
2-
from toolset.test_types.verifications import verify_query_cases
2+
from toolset.test_types.verifications import verify_query_cases, verify_status, verify_headers
33

44

55
class TestType(AbstractTestType):
@@ -39,6 +39,10 @@ def verify(self, base_url):
3939
"Route for cached queries must be at least 15 characters, found '{}' instead".format(self.cached_query_url),
4040
url))
4141

42+
headers, body, status = self.request_headers_and_body_and_status(url)
43+
problems += verify_status(self.request_headers_and_body_and_status, status, url)
44+
problems += verify_headers(self.request_headers_and_body_and_status, headers, url, should_be='json')
45+
4246
if len(problems) == 0:
4347
return [('pass', '', url + case) for case, _ in cases]
4448
else:

toolset/test_types/db/db.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from toolset.test_types.abstract_test_type import AbstractTestType
2-
from toolset.test_types.verifications import basic_body_verification, verify_headers, verify_randomnumber_object, verify_queries_count
2+
from toolset.test_types.verifications import basic_body_verification, verify_status, verify_headers, verify_randomnumber_object, verify_queries_count
33

44

55
class TestType(AbstractTestType):
@@ -28,7 +28,7 @@ def verify(self, base_url):
2828
expected_queries = repetitions * concurrency
2929

3030
url = base_url + self.db_url
31-
headers, body = self.request_headers_and_body(url)
31+
headers, body, status = self.request_headers_and_body_and_status(url)
3232

3333
response, problems = basic_body_verification(body, url)
3434

@@ -62,7 +62,8 @@ def verify(self, base_url):
6262

6363
# Verify response content
6464
problems += verify_randomnumber_object(response, url)
65-
problems += verify_headers(self.request_headers_and_body, headers, url, should_be='json')
65+
problems += verify_status(self.request_headers_and_body_and_status, status, url)
66+
problems += verify_headers(self.request_headers_and_body_and_status, headers, url, should_be='json')
6667

6768
if len(problems) == 0:
6869
problems += verify_queries_count(self, "World", url, concurrency, repetitions, expected_queries, expected_queries)

toolset/test_types/fortune/fortune.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ def verify(self, base_url):
3030
expected_rows = 12 * expected_queries
3131

3232
url = base_url + self.fortune_url
33-
headers, body = self.request_headers_and_body(url)
33+
headers, body, status = self.request_headers_and_body_and_status(url)
3434

3535
_, problems = basic_body_verification(body, url, is_json_check=False)
3636

@@ -49,7 +49,7 @@ def verify(self, base_url):
4949
(valid, diff) = parser.isValidFortune(self.name, body.decode())
5050

5151
if valid:
52-
problems += verify_headers(self.request_headers_and_body, headers, url, should_be='html')
52+
problems += verify_headers(self.request_headers_and_body_and_status, headers, url, should_be='html')
5353
if len(problems) == 0:
5454
problems += verify_queries_count(self, "fortune", url, concurrency, repetitions, expected_queries, expected_rows)
5555
if len(problems) == 0:

toolset/test_types/json/json.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from toolset.test_types.abstract_test_type import AbstractTestType
2-
from toolset.test_types.verifications import basic_body_verification, verify_headers, verify_helloworld_object
2+
from toolset.test_types.verifications import basic_body_verification, verify_status, verify_headers, verify_helloworld_object
33

44
class TestType(AbstractTestType):
55
def __init__(self, config):
@@ -23,7 +23,7 @@ def verify(self, base_url):
2323
'''
2424

2525
url = base_url + self.json_url
26-
headers, body = self.request_headers_and_body(url)
26+
headers, body, status = self.request_headers_and_body_and_status(url)
2727

2828
response, problems = basic_body_verification(body, url)
2929

@@ -38,7 +38,8 @@ def verify(self, base_url):
3838
return problems
3939

4040
problems += verify_helloworld_object(response, url)
41-
problems += verify_headers(self.request_headers_and_body, headers, url, should_be='json')
41+
problems += verify_status(self.request_headers_and_body_and_status, status, url)
42+
problems += verify_headers(self.request_headers_and_body_and_status, headers, url, should_be='json')
4243

4344
if len(problems) > 0:
4445
return problems

toolset/test_types/plaintext/plaintext.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from toolset.test_types.verifications import basic_body_verification, verify_headers
1+
from toolset.test_types.verifications import basic_body_verification, verify_status, verify_headers
22
from toolset.test_types.abstract_test_type import AbstractTestType
33

44

@@ -15,7 +15,7 @@ def __init__(self, config):
1515

1616
def verify(self, base_url):
1717
url = base_url + self.plaintext_url
18-
headers, body = self.request_headers_and_body(url)
18+
headers, body, status = self.request_headers_and_body_and_status(url)
1919

2020
_, problems = basic_body_verification(body, url, is_json_check=False)
2121

@@ -45,7 +45,8 @@ def verify(self, base_url):
4545
"This may negatively affect benchmark performance." %
4646
extra_bytes), url))
4747

48-
problems += verify_headers(self.request_headers_and_body, headers, url, should_be='plaintext')
48+
problems += verify_status(self.request_headers_and_body_and_status, status, url)
49+
problems += verify_headers(self.request_headers_and_body_and_status, headers, url, should_be='plaintext')
4950

5051
if len(problems) == 0:
5152
return [('pass', '', url)]

toolset/test_types/query/query.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from toolset.test_types.abstract_test_type import AbstractTestType
2-
from toolset.test_types.verifications import verify_query_cases
2+
from toolset.test_types.verifications import verify_query_cases, verify_status, verify_headers
33

44

55
class TestType(AbstractTestType):
@@ -39,6 +39,10 @@ def verify(self, base_url):
3939
"Route for queries must be at least 9 characters, found '{}' instead".format(self.query_url),
4040
url))
4141

42+
headers, body, status = self.request_headers_and_body_and_status(url)
43+
problems += verify_status(self.request_headers_and_body_and_status, status, url)
44+
problems += verify_headers(self.request_headers_and_body_and_status, headers, url, should_be='json')
45+
4246
if len(problems) == 0:
4347
return [('pass', '', url + case) for case, _ in cases]
4448
else:

toolset/test_types/update/update.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from toolset.test_types.abstract_test_type import AbstractTestType
2-
from toolset.test_types.verifications import verify_query_cases
2+
from toolset.test_types.verifications import verify_query_cases, verify_status, verify_headers
33

44

55
class TestType(AbstractTestType):
@@ -38,6 +38,10 @@ def verify(self, base_url):
3838
"Route for update must be at least 8 characters, found '{}' instead".format(self.update_url),
3939
url))
4040

41+
headers, body, status = self.request_headers_and_body_and_status(url)
42+
problems += verify_status(self.request_headers_and_body_and_status, status, url)
43+
problems += verify_headers(self.request_headers_and_body_and_status, headers, url, should_be='json')
44+
4145
if len(problems) == 0:
4246
return [('pass', '', url + case) for (case, _) in cases]
4347
else:

toolset/test_types/verifications.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,23 @@ def basic_body_verification(body, url, is_json_check=True):
4141
# they do not need or expect a dict back
4242
return None, []
4343

44+
def verify_status(request_headers_and_body_and_status, status, url, expected_status=200):
45+
'''
46+
Verifies the status code of a framework response
47+
'''
48+
49+
problems = []
50+
51+
if status is not expected_status:
52+
problems.append((
53+
'fail',
54+
'Invalid response status, found \"%s\", did not match \"%s\"'
55+
% (status, expected_status), url))
56+
57+
return problems
58+
4459

45-
def verify_headers(request_headers_and_body, headers, url, should_be='json'):
60+
def verify_headers(request_headers_and_body_and_status, headers, url, should_be='json'):
4661
'''
4762
Verifies the headers of a framework response
4863
param `should_be` is a switch for the three acceptable content types
@@ -76,7 +91,7 @@ def verify_headers(request_headers_and_body, headers, url, should_be='json'):
7691
# Verify response content
7792
# Make sure that the date object isn't cached
7893
sleep(3)
79-
second_headers, body2 = request_headers_and_body(url)
94+
second_headers, body2, status2 = request_headers_and_body_and_status(url)
8095
second_date = second_headers.get('Date')
8196

8297
date2 = second_headers.get('Date')
@@ -349,7 +364,7 @@ def verify_query_cases(self, cases, url, check_updates=False):
349364

350365
for q, max_infraction in cases:
351366
case_url = url + q
352-
headers, body = self.request_headers_and_body(case_url)
367+
headers, body, status = self.request_headers_and_body_and_status(case_url)
353368

354369
try:
355370
queries = int(q) # drops down for 'foo' and ''
@@ -363,7 +378,7 @@ def verify_query_cases(self, cases, url, check_updates=False):
363378

364379
problems += verify_randomnumber_list(expected_len, headers, body,
365380
case_url, max_infraction)
366-
problems += verify_headers(self.request_headers_and_body, headers, case_url)
381+
problems += verify_headers(self.request_headers_and_body_and_status, headers, case_url)
367382

368383
# Only check update changes if we are doing an Update verification and if we're testing
369384
# the highest number of queries, to ensure that we don't accidentally FAIL for a query
@@ -393,7 +408,7 @@ def verify_query_cases(self, cases, url, check_updates=False):
393408
# parameter input
394409
problems += verify_randomnumber_list(
395410
expected_len, headers, body, case_url, max_infraction)
396-
problems += verify_headers(self.request_headers_and_body, headers, case_url)
411+
problems += verify_headers(self.request_headers_and_body_and_status, headers, case_url)
397412

398413
if hasattr(self, 'database'):
399414
# verify the number of queries and rows read for 20 queries, with a concurrency level of 512, with 2 repetitions

0 commit comments

Comments
 (0)