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