# 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()