• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Lint as: python2, python3
2# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6from __future__ import absolute_import
7from __future__ import division
8from __future__ import print_function
9
10import logging
11import logging.handlers
12import mox
13import multiprocessing
14import tempfile
15import time
16import os
17import unittest
18
19from autotest_lib.site_utils import log_socket_server
20from six.moves import range
21
22
23class TestLogSocketServer(mox.MoxTestBase):
24    """Test LogSocketServer can start and save logs to a local file.
25    """
26
27
28    def log_call(self, value, port):
29        """Method to be called in a new process to log to a socket server.
30
31        @param value: Data to be logged.
32        @param port: Port used by log socket server.
33        """
34        logging.getLogger().handlers = []
35        socketHandler = logging.handlers.SocketHandler('localhost', port)
36        logging.getLogger().addHandler(socketHandler)
37        logging.getLogger().level = logging.INFO
38        logging.info(value)
39
40
41    def testMultiProcessLoggingSuccess(self):
42        """Test log can be saved from multiple processes."""
43        # Start log TCP server.
44        super(TestLogSocketServer, self).setUp()
45        log_filename = tempfile.mktemp(suffix='_log_server')
46        log_socket_server.LogSocketServer.start(filename=log_filename,
47                                                level=logging.INFO)
48        processes = []
49        process_number = 10
50        port = log_socket_server.LogSocketServer.port
51        for i in range(process_number):
52            process = multiprocessing.Process(target=self.log_call,
53                                              args=(i, port))
54            process.start()
55            processes.append(process)
56
57        for process in processes:
58            process.join()
59
60        # Wait for TCP server to finish processing data. If process_number is
61        # increased, the wait time should be increased to avoid test flaky.
62        time.sleep(1)
63        log_socket_server.LogSocketServer.stop()
64
65        # Read log to confirm all logs are written to file.
66        num_lines = sum(1 for line in open(log_filename))
67        if process_number != num_lines:
68            logging.warn('Not all log messages were written to file %s. '
69                         'Expected number of logs: %s, Logs found in file: %s',
70                         log_filename, process_number, num_lines)
71        self.assertNotEqual(0, num_lines, 'No log message was written to file '
72                            '%s. Number of logs tried: %s.' %
73                            (log_filename, process_number))
74        os.remove(log_filename)
75
76
77if __name__ == "__main__":
78    unittest.main()
79