xref: /aosp_15_r20/external/autotest/client/cros/video/method_logger.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
3*9c5db199SXin Li# found in the LICENSE file.
4*9c5db199SXin Li
5*9c5db199SXin Liimport logging
6*9c5db199SXin Li
7*9c5db199SXin Li
8*9c5db199SXin Lidef log(method_to_log):
9*9c5db199SXin Li    """ A decorator method to log when 'decorated' methods have been executed.
10*9c5db199SXin Li     This greatly simplifies tracing of the method calls.
11*9c5db199SXin Li
12*9c5db199SXin Li     To log execution of a method just decorate it with *log
13*9c5db199SXin Li
14*9c5db199SXin Li     The decorator logs the method to be executed, its class, the arguments
15*9c5db199SXin Li     supplied to it and its return value.
16*9c5db199SXin Li
17*9c5db199SXin Li     @param method_to_log: Method object that will be logged and invoked.
18*9c5db199SXin Li
19*9c5db199SXin Li    """
20*9c5db199SXin Li    def log_wrapper(self, *args, **kwargs):
21*9c5db199SXin Li        """ Actual method doing the logging and also invokes method_to_log
22*9c5db199SXin Li        """
23*9c5db199SXin Li
24*9c5db199SXin Li        log_str = '%s.%s' % (self.__class__.__name__, method_to_log.__name__)
25*9c5db199SXin Li
26*9c5db199SXin Li        logging.debug('+ ' + log_str)
27*9c5db199SXin Li
28*9c5db199SXin Li        have_args = len(args) > 0
29*9c5db199SXin Li        have_kwargs = len(kwargs) > 0
30*9c5db199SXin Li
31*9c5db199SXin Li        if have_args:
32*9c5db199SXin Li            logging.debug('*** Begin arguments:')
33*9c5db199SXin Li            logging.debug(args)
34*9c5db199SXin Li            logging.debug('=== End arguments.')
35*9c5db199SXin Li
36*9c5db199SXin Li        if have_kwargs:
37*9c5db199SXin Li            logging.debug('*** Begin keyword arguments:')
38*9c5db199SXin Li            logging.debug(kwargs)
39*9c5db199SXin Li            logging.debug('=== End keyword arguments.')
40*9c5db199SXin Li
41*9c5db199SXin Li        result = method_to_log(self, *args, **kwargs)
42*9c5db199SXin Li
43*9c5db199SXin Li        if result is not None:
44*9c5db199SXin Li            logging.debug('### Begin results :')
45*9c5db199SXin Li            logging.debug(result)
46*9c5db199SXin Li            logging.debug('--- End results.')
47*9c5db199SXin Li
48*9c5db199SXin Li        logging.debug('- ' + log_str)
49*9c5db199SXin Li
50*9c5db199SXin Li        return result
51*9c5db199SXin Li
52*9c5db199SXin Li    return log_wrapper