# Copyright 2016 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import os import shutil import tempfile import unittest from unittest import mock from mobly import logger import pytz class LoggerTest(unittest.TestCase): """Verifies code in mobly.logger module.""" def setUp(self): self.log_dir = tempfile.mkdtemp() def tearDown(self): shutil.rmtree(self.log_dir) def test_epoch_to_log_line_timestamp(self): actual_stamp = logger.epoch_to_log_line_timestamp(1469134262116, time_zone=pytz.utc) self.assertEqual("07-21 20:51:02.116", actual_stamp) def test_is_valid_logline_timestamp(self): self.assertTrue(logger.is_valid_logline_timestamp("06-21 17:44:42.336")) def test_is_valid_logline_timestamp_when_wrong_length(self): self.assertFalse(logger.is_valid_logline_timestamp(" 06-21 17:44:42.336")) def test_is_valid_logline_timestamp_when_invalid_content(self): self.assertFalse(logger.is_valid_logline_timestamp("------------------")) @mock.patch('mobly.utils.create_alias') def test_create_latest_log_alias(self, mock_create_alias): logger.create_latest_log_alias('fake_path', alias='latest') mock_create_alias.assert_called_once_with('fake_path', 'latest') @mock.patch('mobly.logger._setup_test_logger') @mock.patch('mobly.logger.create_latest_log_alias') def test_setup_test_logger_creates_log_alias(self, mock_create_latest_log_alias, mock__setup_test_logger): logger.setup_test_logger(self.log_dir) mock__setup_test_logger.assert_called_once_with(self.log_dir, None) mock_create_latest_log_alias.assert_called_once_with(self.log_dir, alias='latest') @mock.patch('mobly.logger._setup_test_logger') @mock.patch('mobly.logger.create_latest_log_alias') def test_setup_test_logger_creates_log_alias_with_custom_value( self, mock_create_latest_log_alias, mock__setup_test_logger): mock_alias = mock.MagicMock() logger.setup_test_logger(self.log_dir, alias=mock_alias) mock_create_latest_log_alias.assert_called_once_with(self.log_dir, alias=mock_alias) def test_sanitize_filename_when_valid(self): fake_filename = 'logcat.txt' expected_filename = 'logcat.txt' self.assertEqual(logger.sanitize_filename(fake_filename), expected_filename) def test_sanitize_filename_when_valid_with_path(self): fake_filename = os.path.join('dir', 'logs', 'logcat.txt') expected_filename = os.path.join('dir', 'logs', 'logcat.txt') self.assertEqual(logger.sanitize_filename(fake_filename), expected_filename) def test_sanitize_filename_when_random_spaces(self): fake_filename = 'log cat file.txt' expected_filename = 'log_cat_file.txt' self.assertEqual(logger.sanitize_filename(fake_filename), expected_filename) def test_sanitize_filename_when_over_max_characters(self): fake_filename = 'l' * 300 expected_filename = 'l' * 237 self.assertEqual(len(logger.sanitize_filename(fake_filename)), 237) self.assertEqual(logger.sanitize_filename(fake_filename), expected_filename) def test_sanitize_filename_when_over_max_characters_with_extension(self): fake_filename = 'l' * 300 + '.txt' expected_filename = 'l' * 233 + '.txt' self.assertEqual(len(logger.sanitize_filename(fake_filename)), 237) self.assertEqual(logger.sanitize_filename(fake_filename), expected_filename) def test_sanitize_filename_when_extension_at_max_characters(self): fake_filename = 'l' * 300 + '.' + 't' * 236 expected_filename = '.' + 't' * 236 self.assertEqual(len(logger.sanitize_filename(fake_filename)), 237) self.assertEqual(logger.sanitize_filename(fake_filename), expected_filename) def test_sanitize_filename_when_extension_over_max_characters(self): fake_filename = 'l' * 300 + '.' + 't' * 300 expected_filename = 'l' * 237 self.assertEqual(len(logger.sanitize_filename(fake_filename)), 237) self.assertEqual(logger.sanitize_filename(fake_filename), expected_filename) def test__sanitize_windows_filename_when_path_characters(self): fake_filename = '/\\' expected_filename = '__' self.assertEqual(logger._sanitize_windows_filename(fake_filename), expected_filename) def test_sanitize_filename_when_specical_characters(self): fake_filename = '<>:"|?*\x00' expected_filename = '---_,,,0' self.assertEqual(logger.sanitize_filename(fake_filename), expected_filename) def test_sanitize_filename_when_con(self): for fake_filename, expected_filename in [ ('con', 'mobly_con'), ('CON', 'mobly_CON'), ('con.txt', 'mobly_con.txt'), ('connections.log', 'connections.log'), ]: self.assertEqual(logger.sanitize_filename(fake_filename), expected_filename) def test_sanitize_filename_when_prn(self): for fake_filename, expected_filename in [ ('prn', 'mobly_prn'), ('PRN', 'mobly_PRN'), ('prn.txt', 'mobly_prn.txt'), ('prnters.log', 'prnters.log'), ]: self.assertEqual(logger.sanitize_filename(fake_filename), expected_filename) def test_sanitize_filename_when_aux(self): for fake_filename, expected_filename in [ ('aux', 'mobly_aux'), ('AUX', 'mobly_AUX'), ('aux.txt', 'mobly_aux.txt'), ('auxiliaries.log', 'auxiliaries.log'), ]: self.assertEqual(logger.sanitize_filename(fake_filename), expected_filename) def test_sanitize_filename_when_nul(self): for fake_filename, expected_filename in [ ('nul', 'mobly_nul'), ('NUL', 'mobly_NUL'), ('nul.txt', 'mobly_nul.txt'), ('nullptrs.log', 'nullptrs.log'), ]: self.assertEqual(logger.sanitize_filename(fake_filename), expected_filename) def test_sanitize_filename_when_com(self): for fake_filename, expected_filename in [ ('com', 'com'), ('COM0', 'mobly_COM0'), ('com1', 'mobly_com1'), ('COM2', 'mobly_COM2'), ('com3', 'mobly_com3'), ('COM4', 'mobly_COM4'), ('com5', 'mobly_com5'), ('COM6', 'mobly_COM6'), ('com7', 'mobly_com7'), ('COM8', 'mobly_COM8'), ('com9', 'mobly_com9'), ('com0.log', 'mobly_com0.log'), ('com0files.log', 'com0files.log'), ]: self.assertEqual(logger.sanitize_filename(fake_filename), expected_filename) def test_sanitize_filename_when_lpt(self): for fake_filename, expected_filename in [ ('lpt', 'lpt'), ('LPT0', 'mobly_LPT0'), ('lpt1', 'mobly_lpt1'), ('LPT2', 'mobly_LPT2'), ('lpt3', 'mobly_lpt3'), ('LPT4', 'mobly_LPT4'), ('lpt5', 'mobly_lpt5'), ('LPT6', 'mobly_LPT6'), ('lpt7', 'mobly_lpt7'), ('LPT8', 'mobly_LPT8'), ('lpt9', 'mobly_lpt9'), ('lpt3.txt', 'mobly_lpt3.txt'), ('lpt3_file.txt', 'lpt3_file.txt'), ]: self.assertEqual(logger.sanitize_filename(fake_filename), expected_filename) def test_sanitize_filename_when_ends_with_space(self): fake_filename = 'logcat.txt ' expected_filename = 'logcat.txt_' self.assertEqual(logger.sanitize_filename(fake_filename), expected_filename) def test_sanitize_filename_when_ends_with_period(self): fake_filename = 'logcat.txt.' expected_filename = 'logcat.txt_' self.assertEqual(logger.sanitize_filename(fake_filename), expected_filename) if __name__ == "__main__": unittest.main()