| # Copyright (c) 2014 The Chromium OS 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 logging | |
| import logging.handlers | |
| import mox | |
| import multiprocessing | |
| import tempfile | |
| import time | |
| import os | |
| import unittest | |
| import log_socket_server | |
| class TestLogSocketServer(mox.MoxTestBase): | |
| """Test LogSocketServer can start and save logs to a local file. | |
| """ | |
| def log_call(self, value, port): | |
| """Method to be called in a new process to log to a socket server. | |
| @param value: Data to be logged. | |
| @param port: Port used by log socket server. | |
| """ | |
| logging.getLogger().handlers = [] | |
| socketHandler = logging.handlers.SocketHandler('localhost', port) | |
| logging.getLogger().addHandler(socketHandler) | |
| logging.getLogger().level = logging.INFO | |
| logging.info(value) | |
| def testMultiProcessLoggingSuccess(self): | |
| """Test log can be saved from multiple processes.""" | |
| # Start log TCP server. | |
| super(TestLogSocketServer, self).setUp() | |
| log_filename = tempfile.mktemp(suffix='_log_server') | |
| log_socket_server.LogSocketServer.start(filename=log_filename, | |
| level=logging.INFO) | |
| processes = [] | |
| process_number = 10 | |
| port = log_socket_server.LogSocketServer.port | |
| for i in range(process_number): | |
| process = multiprocessing.Process(target=self.log_call, | |
| args=(i, port)) | |
| process.start() | |
| processes.append(process) | |
| for process in processes: | |
| process.join() | |
| # Wait for TCP server to finish processing data. If process_number is | |
| # increased, the wait time should be increased to avoid test flaky. | |
| time.sleep(1) | |
| log_socket_server.LogSocketServer.stop() | |
| # Read log to confirm all logs are written to file. | |
| num_lines = sum(1 for line in open(log_filename)) | |
| if process_number != num_lines: | |
| logging.warn('Not all log messages were written to file %s. ' | |
| 'Expected number of logs: %s, Logs found in file: %s', | |
| log_filename, process_number, num_lines) | |
| self.assertNotEqual(0, num_lines, 'No log message was written to file ' | |
| '%s. Number of logs tried: %s.' % | |
| (log_filename, process_number)) | |
| os.remove(log_filename) | |
| if __name__ == "__main__": | |
| unittest.main() |