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