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