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