Very scary test here. Trying to see if we can boost speed on very large terminals.
This commit is contained in:
@@ -10,6 +10,7 @@
|
|||||||
# blink = 5 if attr & 1 else 0
|
# blink = 5 if attr & 1 else 0
|
||||||
# bold = 1 if attr & 16 else 0
|
# bold = 1 if attr & 16 else 0
|
||||||
|
|
||||||
|
import errno
|
||||||
import fcntl
|
import fcntl
|
||||||
import glob
|
import glob
|
||||||
import os
|
import os
|
||||||
@@ -53,6 +54,9 @@ class driver(screenDriver):
|
|||||||
fgColorValues: Foreground color value mappings
|
fgColorValues: Foreground color value mappings
|
||||||
hichar: High character mask for Unicode support
|
hichar: High character mask for Unicode support
|
||||||
"""
|
"""
|
||||||
|
read_retry_attempts = 10
|
||||||
|
read_retry_delay = 0.05
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
screenDriver.__init__(self)
|
screenDriver.__init__(self)
|
||||||
self.ListSessions = None
|
self.ListSessions = None
|
||||||
@@ -251,23 +255,39 @@ class driver(screenDriver):
|
|||||||
bytes: File content as bytes
|
bytes: File content as bytes
|
||||||
"""
|
"""
|
||||||
d = b""
|
d = b""
|
||||||
|
for attempt in range(self.read_retry_attempts + 1):
|
||||||
file.seek(0)
|
file.seek(0)
|
||||||
try:
|
try:
|
||||||
d = file.read()
|
return file.read()
|
||||||
except Exception as e:
|
except OSError as e:
|
||||||
|
if (
|
||||||
|
e.errno == errno.EINVAL
|
||||||
|
and attempt < self.read_retry_attempts
|
||||||
|
):
|
||||||
|
time.sleep(self.read_retry_delay)
|
||||||
|
continue
|
||||||
self.env["runtime"]["DebugManager"].write_debug_out(
|
self.env["runtime"]["DebugManager"].write_debug_out(
|
||||||
"vcsaDriver get_screen_text: Error reading file: " + str(e),
|
"vcsaDriver get_screen_text: Error reading file: "
|
||||||
|
+ str(e),
|
||||||
debug.DebugLevel.ERROR,
|
debug.DebugLevel.ERROR,
|
||||||
)
|
)
|
||||||
|
break
|
||||||
|
except Exception as e:
|
||||||
|
self.env["runtime"]["DebugManager"].write_debug_out(
|
||||||
|
"vcsaDriver get_screen_text: Error reading file: "
|
||||||
|
+ str(e),
|
||||||
|
debug.DebugLevel.ERROR,
|
||||||
|
)
|
||||||
|
break
|
||||||
|
|
||||||
file.seek(0)
|
file.seek(0)
|
||||||
while True:
|
while True:
|
||||||
# Read from file
|
|
||||||
try:
|
try:
|
||||||
chunk = file.readline(1)
|
chunk = file.readline(1)
|
||||||
if not chunk:
|
if not chunk:
|
||||||
break
|
break
|
||||||
d += chunk
|
d += chunk
|
||||||
except Exception as e:
|
except Exception:
|
||||||
break
|
break
|
||||||
return d
|
return d
|
||||||
|
|
||||||
|
|||||||
@@ -22,14 +22,49 @@ class BulkReadFailure:
|
|||||||
return next(self.chunks)
|
return next(self.chunks)
|
||||||
|
|
||||||
|
|
||||||
def test_vcsa_read_fallback_stops_at_eof():
|
class TransientInvalidArgumentRead:
|
||||||
|
def __init__(self, payload):
|
||||||
|
self.payload = payload
|
||||||
|
self.read_calls = 0
|
||||||
|
self.readline_calls = 0
|
||||||
|
|
||||||
|
def seek(self, offset):
|
||||||
|
assert offset == 0
|
||||||
|
|
||||||
|
def read(self):
|
||||||
|
self.read_calls += 1
|
||||||
|
if self.read_calls == 1:
|
||||||
|
raise OSError(22, "Invalid argument")
|
||||||
|
return self.payload
|
||||||
|
|
||||||
|
def readline(self, size):
|
||||||
|
self.readline_calls += 1
|
||||||
|
return b""
|
||||||
|
|
||||||
|
|
||||||
|
def build_vcsa_driver():
|
||||||
vcsa_driver = VcsaDriver.__new__(VcsaDriver)
|
vcsa_driver = VcsaDriver.__new__(VcsaDriver)
|
||||||
vcsa_driver.env = {
|
vcsa_driver.env = {
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"DebugManager": Mock(),
|
"DebugManager": Mock(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
vcsa_driver.read_retry_delay = 0
|
||||||
|
return vcsa_driver
|
||||||
|
|
||||||
|
|
||||||
|
def test_vcsa_read_fallback_stops_at_eof():
|
||||||
|
vcsa_driver = build_vcsa_driver()
|
||||||
screen_file = BulkReadFailure([b"a", b"b", b""])
|
screen_file = BulkReadFailure([b"a", b"b", b""])
|
||||||
|
|
||||||
assert vcsa_driver.read_file(screen_file) == b"ab"
|
assert vcsa_driver.read_file(screen_file) == b"ab"
|
||||||
assert screen_file.readline_calls == 3
|
assert screen_file.readline_calls == 3
|
||||||
|
|
||||||
|
|
||||||
|
def test_vcsa_read_retries_transient_invalid_argument():
|
||||||
|
vcsa_driver = build_vcsa_driver()
|
||||||
|
screen_file = TransientInvalidArgumentRead(b"\x01\x02\x00\x00x")
|
||||||
|
|
||||||
|
assert vcsa_driver.read_file(screen_file) == b"\x01\x02\x00\x00x"
|
||||||
|
assert screen_file.read_calls == 2
|
||||||
|
assert screen_file.readline_calls == 0
|
||||||
|
|||||||
Reference in New Issue
Block a user