Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 16 additions & 8 deletions tests/http/testenv/curl.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import os
import sys
import time
from functools import cmp_to_key
from threading import Thread

import psutil
Expand Down Expand Up @@ -525,12 +526,12 @@ def check_stats_timeline(self, idx):
}
# stat keys where we expect a positive value
ref_tl = []
somewhere_keys = []
# time_queue has it's own start timestamp. Other timers start *after*
# queueing is done. queue duration might therefore be anywhere.
somewhere_keys = ['time_queue']
exact_match = True
# redirects mess up the queue time, only count without
if s['time_redirect'] == 0:
ref_tl += ['time_queue']
else:
# redirects mess up the times, some are accumulative
if s['time_redirect']:
exact_match = False
# connect events?
if url.startswith('ftp'):
Expand All @@ -549,7 +550,7 @@ def check_stats_timeline(self, idx):
ref_tl += dl_tl
# the first byte of the response may arrive before we
# track the other times when the client is slow (CI).
somewhere_keys = ['time_starttransfer']
somewhere_keys.extend(['time_starttransfer'])
elif s['size_upload'] > 0 and s['size_download'] == 0:
# this is an upload
ul_tl = ['time_pretransfer', 'time_posttransfer']
Expand All @@ -567,9 +568,16 @@ def check_stats_timeline(self, idx):
# assert all events not in reference timeline are 0
for key in [key for key in all_keys if key not in ref_tl and key not in somewhere_keys]:
self.check_stat_zero(s, key)

# calculate the timeline that did happen
seen_tl = sorted(ref_tl, key=lambda ts: s[ts])
assert seen_tl == ref_tl, f'{[f"{ts}: {s[ts]}" for ts in seen_tl]}'
def cmp_ts(t1, t2):
n = s[t1] - s[t2]
if not n: # same timestamp, order to expected occurrence
return ref_tl.index(t1) - ref_tl.index(t2)
return n

seen_tl = sorted(ref_tl, key=cmp_to_key(cmp_ts))
assert seen_tl == ref_tl, f'timeline {idx}: {[f"{ts}: {s[ts]}" for ts in seen_tl]}\n{self.dump_logs()}'
for key in somewhere_keys:
self.check_stat_positive(s, idx, key)
assert s[key] <= s['time_total']
Expand Down