tests/avocado: excercise scripts/replay-dump.py in replay tests

This runs replay-dump.py after recording a trace, and fails the test if
the script fails.

replay-dump.py is modified to exit with non-zero if an error is
encountered while parsing, to support this.

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Pavel Dovgalyuk <Pavel.Dovgalyuk@ispras.ru>
Signed-off-by: Nicholas Piggin <npiggin@gmail.com>

gitlab with this change

v5: Update timeout to 180s because x86 was just exceeding 120s in
Message-Id: <20240813050638.446172-4-npiggin@gmail.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20240813202329.1237572-12-alex.bennee@linaro.org>
This commit is contained in:
Nicholas Piggin 2024-08-13 21:23:19 +01:00 committed by Alex Bennée
parent 01a385fb49
commit 4926b6e644
3 changed files with 26 additions and 3 deletions

View File

@ -21,6 +21,7 @@
import argparse import argparse
import struct import struct
import os import os
import sys
from collections import namedtuple from collections import namedtuple
from os import path from os import path
@ -100,7 +101,7 @@ def call_decode(table, index, dumpfile):
print("Could not decode index: %d" % (index)) print("Could not decode index: %d" % (index))
print("Entry is: %s" % (decoder)) print("Entry is: %s" % (decoder))
print("Decode Table is:\n%s" % (table)) print("Decode Table is:\n%s" % (table))
return False raise(Exception("unknown event"))
else: else:
return decoder.fn(decoder.eid, decoder.name, dumpfile) return decoder.fn(decoder.eid, decoder.name, dumpfile)
@ -121,7 +122,7 @@ def print_event(eid, name, string=None, event_count=None):
def decode_unimp(eid, name, _unused_dumpfile): def decode_unimp(eid, name, _unused_dumpfile):
"Unimplemented decoder, will trigger exit" "Unimplemented decoder, will trigger exit"
print("%s not handled - will now stop" % (name)) print("%s not handled - will now stop" % (name))
return False raise(Exception("unhandled event"))
def decode_plain(eid, name, _unused_dumpfile): def decode_plain(eid, name, _unused_dumpfile):
"Plain events without additional data" "Plain events without additional data"
@ -434,6 +435,7 @@ def decode_file(filename):
dumpfile) dumpfile)
except Exception as inst: except Exception as inst:
print(f"error {inst}") print(f"error {inst}")
sys.exit(1)
finally: finally:
print(f"Reached {dumpfile.tell()} of {dumpsize} bytes") print(f"Reached {dumpfile.tell()} of {dumpsize} bytes")

View File

@ -13,6 +13,7 @@ import lzma
import shutil import shutil
import logging import logging
import time import time
import subprocess
from avocado import skip from avocado import skip
from avocado import skipUnless from avocado import skipUnless
@ -31,7 +32,7 @@ class ReplayKernelBase(LinuxKernelTest):
terminates. terminates.
""" """
timeout = 120 timeout = 180
KERNEL_COMMON_COMMAND_LINE = 'printk.time=1 panic=-1 ' KERNEL_COMMON_COMMAND_LINE = 'printk.time=1 panic=-1 '
def run_vm(self, kernel_path, kernel_command_line, console_pattern, def run_vm(self, kernel_path, kernel_command_line, console_pattern,
@ -63,6 +64,8 @@ class ReplayKernelBase(LinuxKernelTest):
vm.shutdown() vm.shutdown()
logger.info('finished the recording with log size %s bytes' logger.info('finished the recording with log size %s bytes'
% os.path.getsize(replay_path)) % os.path.getsize(replay_path))
self.run_replay_dump(replay_path)
logger.info('successfully tested replay-dump.py')
else: else:
vm.wait() vm.wait()
logger.info('successfully finished the replay') logger.info('successfully finished the replay')
@ -70,6 +73,14 @@ class ReplayKernelBase(LinuxKernelTest):
logger.info('elapsed time %.2f sec' % elapsed) logger.info('elapsed time %.2f sec' % elapsed)
return elapsed return elapsed
def run_replay_dump(self, replay_path):
try:
subprocess.check_call(["./scripts/replay-dump.py",
"-f", replay_path],
stdout=subprocess.DEVNULL)
except subprocess.CalledProcessError:
self.fail('replay-dump.py failed')
def run_rr(self, kernel_path, kernel_command_line, console_pattern, def run_rr(self, kernel_path, kernel_command_line, console_pattern,
shift=7, args=None): shift=7, args=None):
replay_path = os.path.join(self.workdir, 'replay.bin') replay_path = os.path.join(self.workdir, 'replay.bin')

View File

@ -94,6 +94,8 @@ class ReplayLinux(LinuxTest):
vm.shutdown() vm.shutdown()
logger.info('finished the recording with log size %s bytes' logger.info('finished the recording with log size %s bytes'
% os.path.getsize(replay_path)) % os.path.getsize(replay_path))
self.run_replay_dump(replay_path)
logger.info('successfully tested replay-dump.py')
else: else:
vm.event_wait('SHUTDOWN', self.timeout) vm.event_wait('SHUTDOWN', self.timeout)
vm.wait() vm.wait()
@ -108,6 +110,14 @@ class ReplayLinux(LinuxTest):
logger = logging.getLogger('replay') logger = logging.getLogger('replay')
logger.info('replay overhead {:.2%}'.format(t2 / t1 - 1)) logger.info('replay overhead {:.2%}'.format(t2 / t1 - 1))
def run_replay_dump(self, replay_path):
try:
subprocess.check_call(["./scripts/replay-dump.py",
"-f", replay_path],
stdout=subprocess.DEVNULL)
except subprocess.CalledProcessError:
self.fail('replay-dump.py failed')
@skipUnless(os.getenv('AVOCADO_TIMEOUT_EXPECTED'), 'Test might timeout') @skipUnless(os.getenv('AVOCADO_TIMEOUT_EXPECTED'), 'Test might timeout')
class ReplayLinuxX8664(ReplayLinux): class ReplayLinuxX8664(ReplayLinux):
""" """