blob: c0f4974628ee2645ae378f9d6fdbae22239dd79f [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import os
import re
import subprocess
from host import Host
class Log(object):
"""Provides a context-managed interface to the fuzzing logs."""
def __init__(self, fuzzer):
self.fuzzer = fuzzer
self.device = fuzzer.device
self.host = fuzzer.host
def __enter__(self):
"""Resets the fuzzing logs.
This will clear stale logs from the device for the given fuzzer and
restart loglistener.
"""
self.device.ssh(['rm', self.fuzzer.data_path('fuzz-*.log')])
self.host.killall('loglistener')
with open(self.fuzzer.results('zircon.log'), 'w') as log:
self.host.zircon_tool(['loglistener'], logfile=log)
def __exit__(self, e_type, e_value, traceback):
"""Gathers and processes the fuzzing logs.
This will stop loglistener and symbolize its output. It will also
retrieve fuzzing logs from
the device for each libFuzzer worker, and download any test unit artifacts
they reference.
"""
self.host.killall('loglistener')
with open(self.fuzzer.results('zircon.log'), 'r') as log_in:
with open(self.fuzzer.results('symbolized.log'), 'w') as log_out:
self.host.symbolize(log_in, log_out)
try:
self.device.fetch(
self.fuzzer.data_path('fuzz-*.log'), self.fuzzer.results())
except subprocess.CalledProcessError:
pass
units = []
pattern = re.compile(r'Test unit written to (\S*)$')
for log in os.listdir(self.fuzzer.results()):
if log.startswith('fuzz-') and log.endswith('.log'):
with open(self.fuzzer.results(log), 'r') as f:
matches = [pattern.match(line) for line in f.readlines()]
units.extend([m.group(1) for m in matches if m])
for unit in units:
self.device.fetch(unit, self.fuzzer.results())