1# Copyright 2017 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5"""This module contains utilities for test to report result to Sponge. 6""" 7 8import logging 9 10from autotest_lib.site_utils.sponge_lib import autotest_dynamic_job 11from autotest_lib.client.common_lib import decorators 12 13try: 14 from sponge import upload_utils 15except ImportError: 16 logging.debug('Module failed to be imported: sponge') 17 upload_utils = None 18 19 20 21class SpongeLogHandler(logging.Handler): 22 """Helper log handler for logging during sponge.""" 23 def __init__(self, log_func): 24 super(SpongeLogHandler, self).__init__() 25 self.log_func = log_func 26 27 def emit(self, record): 28 log_entry = self.format(record) 29 self.log_func(log_entry) 30 31 32 33@decorators.test_module_available(upload_utils) 34def upload_results(job, log=logging.debug): 35 """Upload test results to Sponge with given job details. 36 37 @param job: A job object created by tko/parsers. 38 @param log: Logging method, default is logging.debug. 39 40 @return: A url to the Sponge invocation. 41 """ 42 start_level = logging.getLogger().level 43 44 log_handler = SpongeLogHandler(log) 45 logging.getLogger().addHandler(log_handler) 46 logging.getLogger().setLevel(logging.DEBUG) 47 48 logging.info("added log handler") 49 50 try: 51 logging.info('Starting sponge upload.') 52 info = autotest_dynamic_job.DynamicJobInfo(job) 53 return upload_utils.UploadInfo(info) 54 except: 55 logging.exception('Failed to upload to sponge.') 56 finally: 57 logging.getLogger().removeHandler(log_handler) 58 logging.getLogger().setLevel(start_level) 59