1c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette#!/usr/bin/env python 2c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette# Copyright 2014 The Chromium OS Authors. All rights reserved. 3c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette# Use of this source code is governed by a BSD-style license that can be 4c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette# found in the LICENSE file. 5c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 673fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnetteimport mock 7c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnetteimport time 8c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnetteimport unittest 9c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 10c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnetteimport common 11c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 12c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnettefrom autotest_lib.client.common_lib import time_utils 13c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnettefrom autotest_lib.site_utils import dut_status 14c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 15c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 16c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnetteclass TimeOptionTests(unittest.TestCase): 17c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette """Test the --since, --until, and --destination options. 18c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 19c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette The options are allowed in these seven combinations: 20c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette * No options - use the default end time and duration. 21c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette * --since - use the given start time and the default end time. 22c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette * --until - use the given end time and the default duration. 23c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette * --duration - use the given duration and the default end time. 24c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette * --since --until - use the given start and end times. 25c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette * --since --duration - use the given start time and duration. 26c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette * --until --duration - use the given end time and duration. 27c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 28c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette It's an error to use all three options together. 29c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 30c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette """ 31c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 3273fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette def setUp(self): 3373fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette self.test_time = time.time() 3473fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette 35c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette def _try_parse(self, options): 3673fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette with mock.patch('time.time', return_value=self.test_time): 3773fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette arguments = dut_status._parse_command( 3873fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette ['mumble.py'] + options + ['hostname']) 3973fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette dut_status._validate_time_range(arguments) 407412fa86c86876b10f96e907129b8399142ba37aRichard Barnette return arguments 41c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 42c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette def _check_duration(self, arguments, duration): 43c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette start_time = (arguments.until - duration * 3600) 4473fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette self.assertEqual(arguments.since, start_time) 45c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 46c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette def test_default_time_bounds(self): 47c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette """Test time bounds when no options are supplied.""" 4873fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette end_time = int(self.test_time) 49c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette arguments = self._try_parse([]) 5073fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette self.assertEqual(arguments.until, end_time) 51c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette self._check_duration(arguments, dut_status._DEFAULT_DURATION) 52c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 53c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette def test_start_only(self): 54c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette """Test time bounds with --since only. 55c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 56c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette Also tests that --since and -s are equivalent. 57c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette """ 5873fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette end_time = int(self.test_time) 597412fa86c86876b10f96e907129b8399142ba37aRichard Barnette start_time = end_time - 3600 607412fa86c86876b10f96e907129b8399142ba37aRichard Barnette start_time_string = time_utils.epoch_time_to_date_string(start_time) 61c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette for option in ['--since', '-s']: 62c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette arguments = self._try_parse([option, start_time_string]) 6373fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette self.assertEqual(arguments.until, end_time) 6473fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette self.assertEqual(arguments.since, start_time) 65c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 66c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette def test_end_only(self): 67c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette """Test time bounds with --until only. 68c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 69c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette Also tests that --until and -u are equivalent. 70c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette """ 7173fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette end_time = int(self.test_time) - 3600 727412fa86c86876b10f96e907129b8399142ba37aRichard Barnette end_time_string = time_utils.epoch_time_to_date_string(end_time) 73c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette for option in ['--until', '-u']: 74c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette arguments = self._try_parse([option, end_time_string]) 7573fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette self.assertEqual(arguments.until, end_time) 76c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette self._check_duration(arguments, dut_status._DEFAULT_DURATION) 77c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 78c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette def test_duration_only(self): 79c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette """Test time bounds with --duration only. 80c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 81c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette Also tests that --duration and -d are equivalent. 82c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette """ 83c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette for option in ['--duration', '-d']: 84c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette duration = 4 85c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette duration_string = '%d' % duration 8673fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette end_time = int(self.test_time) 87c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette arguments = self._try_parse([option, duration_string]) 8873fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette self.assertEqual(arguments.until, end_time) 89c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette self._check_duration(arguments, duration) 90c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 91c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette def test_start_and_end(self): 92c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette """Test time bounds with --since and --until.""" 9373fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette start_time = int(self.test_time) - 5 * 3600 94c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette start_time_string = time_utils.epoch_time_to_date_string(start_time) 95c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette end_time = start_time + 4 * 3600 96c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette end_time_string = time_utils.epoch_time_to_date_string(end_time) 9773fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette arguments = self._try_parse(['-s', start_time_string, 9873fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette '-u', end_time_string]) 9973fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette self.assertEqual(arguments.since, start_time) 10073fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette self.assertEqual(arguments.until, end_time) 101c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 102c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette def test_start_and_duration(self): 103c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette """Test time bounds with --since and --duration.""" 10473fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette start_time = int(self.test_time) - 5 * 3600 105c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette start_time_string = time_utils.epoch_time_to_date_string(start_time) 106c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette duration = 4 107c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette duration_string = '%d' % duration 1087412fa86c86876b10f96e907129b8399142ba37aRichard Barnette arguments = self._try_parse(['-s', start_time_string, 1097412fa86c86876b10f96e907129b8399142ba37aRichard Barnette '-d', duration_string]) 11073fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette self.assertEqual(arguments.since, start_time) 111c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette self._check_duration(arguments, duration) 112c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 113c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette def test_end_and_duration(self): 114c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette """Test time bounds with --until and --duration.""" 11573fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette end_time = int(self.test_time) - 5 * 3600 116c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette end_time_string = time_utils.epoch_time_to_date_string(end_time) 117c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette duration = 4 118c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette duration_string = '%d' % duration 1197412fa86c86876b10f96e907129b8399142ba37aRichard Barnette arguments = self._try_parse(['-u', end_time_string, 1207412fa86c86876b10f96e907129b8399142ba37aRichard Barnette '-d', duration_string]) 12173fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette self.assertEqual(arguments.until, end_time) 122c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette self._check_duration(arguments, duration) 123c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 124c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette def test_all_options(self): 125c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette """Test that all three options are a fatal error.""" 12673fa120db9246f7236ea669dd5c8b0c95c04a8faRichard Barnette start_time = int(self.test_time) - 5 * 3600 127c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette start_time_string = time_utils.epoch_time_to_date_string(start_time) 128c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette duration = 4 129c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette duration_string = '%d' % duration 130c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette end_time = start_time + duration * 3600 131c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette end_time_string = time_utils.epoch_time_to_date_string(end_time) 132c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette with self.assertRaises(SystemExit): 1337412fa86c86876b10f96e907129b8399142ba37aRichard Barnette self._try_parse(['-s', start_time_string, 1347412fa86c86876b10f96e907129b8399142ba37aRichard Barnette '-u', end_time_string, 1357412fa86c86876b10f96e907129b8399142ba37aRichard Barnette '-d', duration_string]) 136c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 137c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette 138c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnetteif __name__ == '__main__': 139c9b79339b9792de002e9524e5303c475857c7192J. Richard Barnette unittest.main() 140