J. Richard Barnette | c9b7933 | 2014-09-22 13:14:33 -0700 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | # Copyright 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 | |
| 6 | import time |
| 7 | import unittest |
| 8 | |
| 9 | import common |
| 10 | |
| 11 | from autotest_lib.client.common_lib import time_utils |
| 12 | from autotest_lib.site_utils import dut_status |
| 13 | |
| 14 | |
| 15 | class TimeOptionTests(unittest.TestCase): |
| 16 | """Test the --since, --until, and --destination options. |
| 17 | |
| 18 | The options are allowed in these seven combinations: |
| 19 | * No options - use the default end time and duration. |
| 20 | * --since - use the given start time and the default end time. |
| 21 | * --until - use the given end time and the default duration. |
| 22 | * --duration - use the given duration and the default end time. |
| 23 | * --since --until - use the given start and end times. |
| 24 | * --since --duration - use the given start time and duration. |
| 25 | * --until --duration - use the given end time and duration. |
| 26 | |
| 27 | It's an error to use all three options together. |
| 28 | |
| 29 | """ |
| 30 | |
| 31 | def _try_parse(self, options): |
| 32 | return dut_status._parse_command( |
| 33 | ['mumble.py'] + options + ['hostname']) |
| 34 | |
| 35 | |
| 36 | def _check_duration(self, arguments, duration): |
| 37 | start_time = (arguments.until - duration * 3600) |
| 38 | assert arguments.since == start_time |
| 39 | |
| 40 | |
| 41 | def _check_default_end(self, arguments, end_time): |
| 42 | max_end = int(time.time()) |
| 43 | assert arguments.until >= end_time |
| 44 | assert arguments.until <= max_end |
| 45 | |
| 46 | |
| 47 | def test_default_time_bounds(self): |
| 48 | """Test time bounds when no options are supplied.""" |
| 49 | end_time = int(time.time()) |
| 50 | arguments = self._try_parse([]) |
| 51 | self._check_default_end(arguments, end_time) |
| 52 | self._check_duration(arguments, dut_status._DEFAULT_DURATION) |
| 53 | |
| 54 | |
| 55 | def test_start_only(self): |
| 56 | """Test time bounds with --since only. |
| 57 | |
| 58 | Also tests that --since and -s are equivalent. |
| 59 | |
| 60 | """ |
| 61 | for option in ['--since', '-s']: |
| 62 | end_time = int(time.time()) |
| 63 | start_time = end_time - 3600 |
| 64 | start_time_string = time_utils.epoch_time_to_date_string(start_time) |
| 65 | arguments = self._try_parse([option, start_time_string]) |
| 66 | self._check_default_end(arguments, end_time) |
| 67 | assert arguments.since == start_time |
| 68 | |
| 69 | |
| 70 | def test_end_only(self): |
| 71 | """Test time bounds with --until only. |
| 72 | |
| 73 | Also tests that --until and -u are equivalent. |
| 74 | |
| 75 | """ |
| 76 | for option in ['--until', '-u']: |
| 77 | end_time = int(time.time()) - 3600 |
| 78 | end_time_string = time_utils.epoch_time_to_date_string(end_time) |
| 79 | arguments = self._try_parse([option, end_time_string]) |
| 80 | assert arguments.until == end_time |
| 81 | self._check_duration(arguments, dut_status._DEFAULT_DURATION) |
| 82 | |
| 83 | |
| 84 | def test_duration_only(self): |
| 85 | """Test time bounds with --duration only. |
| 86 | |
| 87 | Also tests that --duration and -d are equivalent. |
| 88 | |
| 89 | """ |
| 90 | for option in ['--duration', '-d']: |
| 91 | duration = 4 |
| 92 | duration_string = '%d' % duration |
| 93 | end_time = int(time.time()) |
| 94 | arguments = self._try_parse([option, duration_string]) |
| 95 | self._check_default_end(arguments, end_time) |
| 96 | self._check_duration(arguments, duration) |
| 97 | |
| 98 | |
| 99 | def test_start_and_end(self): |
| 100 | """Test time bounds with --since and --until.""" |
| 101 | start_time = int(time.time()) - 5 * 3600 |
| 102 | start_time_string = time_utils.epoch_time_to_date_string(start_time) |
| 103 | end_time = start_time + 4 * 3600 |
| 104 | end_time_string = time_utils.epoch_time_to_date_string(end_time) |
| 105 | arguments = self._try_parse(['--s', start_time_string, |
| 106 | '--u', end_time_string]) |
| 107 | assert arguments.since == start_time |
| 108 | assert arguments.until == end_time |
| 109 | |
| 110 | |
| 111 | def test_start_and_duration(self): |
| 112 | """Test time bounds with --since and --duration.""" |
| 113 | start_time = int(time.time()) - 5 * 3600 |
| 114 | start_time_string = time_utils.epoch_time_to_date_string(start_time) |
| 115 | duration = 4 |
| 116 | duration_string = '%d' % duration |
| 117 | arguments = self._try_parse(['--s', start_time_string, |
| 118 | '--d', duration_string]) |
| 119 | assert arguments.since == start_time |
| 120 | self._check_duration(arguments, duration) |
| 121 | |
| 122 | |
| 123 | def test_end_and_duration(self): |
| 124 | """Test time bounds with --until and --duration.""" |
| 125 | end_time = int(time.time()) - 5 * 3600 |
| 126 | end_time_string = time_utils.epoch_time_to_date_string(end_time) |
| 127 | duration = 4 |
| 128 | duration_string = '%d' % duration |
| 129 | arguments = self._try_parse(['--u', end_time_string, |
| 130 | '--d', duration_string]) |
| 131 | assert arguments.until == end_time |
| 132 | self._check_duration(arguments, duration) |
| 133 | |
| 134 | |
| 135 | def test_all_options(self): |
| 136 | """Test that all three options are a fatal error.""" |
| 137 | start_time = int(time.time()) - 5 * 3600 |
| 138 | start_time_string = time_utils.epoch_time_to_date_string(start_time) |
| 139 | duration = 4 |
| 140 | duration_string = '%d' % duration |
| 141 | end_time = start_time + duration * 3600 |
| 142 | end_time_string = time_utils.epoch_time_to_date_string(end_time) |
| 143 | with self.assertRaises(SystemExit): |
| 144 | self._try_parse(['--s', start_time_string, |
| 145 | '--u', end_time_string, |
| 146 | '--d', duration_string]) |
| 147 | |
| 148 | |
| 149 | if __name__ == '__main__': |
| 150 | unittest.main() |