xref: /aosp_15_r20/external/autotest/site_utils/dut_status_unittest.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li#!/usr/bin/env python3
2*9c5db199SXin Li# Copyright 2014 The Chromium OS Authors. All rights reserved.
3*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
4*9c5db199SXin Li# found in the LICENSE file.
5*9c5db199SXin Li
6*9c5db199SXin Liimport time
7*9c5db199SXin Liimport unittest
8*9c5db199SXin Lifrom unittest import mock
9*9c5db199SXin Li
10*9c5db199SXin Liimport common
11*9c5db199SXin Li
12*9c5db199SXin Lifrom autotest_lib.client.common_lib import time_utils
13*9c5db199SXin Lifrom autotest_lib.site_utils import dut_status
14*9c5db199SXin Li
15*9c5db199SXin Li
16*9c5db199SXin Liclass TimeOptionTests(unittest.TestCase):
17*9c5db199SXin Li    """Test the --since, --until, and --destination options.
18*9c5db199SXin Li
19*9c5db199SXin Li    The options are allowed in these seven combinations:
20*9c5db199SXin Li      * No options - use the default end time and duration.
21*9c5db199SXin Li      * --since - use the given start time and the default end time.
22*9c5db199SXin Li      * --until - use the given end time and the default duration.
23*9c5db199SXin Li      * --duration - use the given duration and the default end time.
24*9c5db199SXin Li      * --since --until - use the given start and end times.
25*9c5db199SXin Li      * --since --duration - use the given start time and duration.
26*9c5db199SXin Li      * --until --duration - use the given end time and duration.
27*9c5db199SXin Li
28*9c5db199SXin Li    It's an error to use all three options together.
29*9c5db199SXin Li
30*9c5db199SXin Li    """
31*9c5db199SXin Li
32*9c5db199SXin Li    def setUp(self):
33*9c5db199SXin Li        self.test_time = time.time()
34*9c5db199SXin Li
35*9c5db199SXin Li    def _try_parse(self, options):
36*9c5db199SXin Li        with mock.patch('time.time', return_value=self.test_time):
37*9c5db199SXin Li            arguments = dut_status._parse_command(
38*9c5db199SXin Li                    ['mumble.py'] + options + ['hostname'])
39*9c5db199SXin Li            dut_status._validate_time_range(arguments)
40*9c5db199SXin Li        return arguments
41*9c5db199SXin Li
42*9c5db199SXin Li    def _check_duration(self, arguments, duration):
43*9c5db199SXin Li        start_time = (arguments.until - duration * 3600)
44*9c5db199SXin Li        self.assertEqual(arguments.since, start_time)
45*9c5db199SXin Li
46*9c5db199SXin Li    def test_default_time_bounds(self):
47*9c5db199SXin Li        """Test time bounds when no options are supplied."""
48*9c5db199SXin Li        end_time = int(self.test_time)
49*9c5db199SXin Li        arguments = self._try_parse([])
50*9c5db199SXin Li        self.assertEqual(arguments.until, end_time)
51*9c5db199SXin Li        self._check_duration(arguments, dut_status._DEFAULT_DURATION)
52*9c5db199SXin Li
53*9c5db199SXin Li    def test_start_only(self):
54*9c5db199SXin Li        """Test time bounds with --since only.
55*9c5db199SXin Li
56*9c5db199SXin Li        Also tests that --since and -s are equivalent.
57*9c5db199SXin Li        """
58*9c5db199SXin Li        end_time = int(self.test_time)
59*9c5db199SXin Li        start_time = end_time - 3600
60*9c5db199SXin Li        start_time_string = time_utils.epoch_time_to_date_string(start_time)
61*9c5db199SXin Li        for option in ['--since', '-s']:
62*9c5db199SXin Li            arguments = self._try_parse([option, start_time_string])
63*9c5db199SXin Li            self.assertEqual(arguments.until, end_time)
64*9c5db199SXin Li            self.assertEqual(arguments.since, start_time)
65*9c5db199SXin Li
66*9c5db199SXin Li    def test_end_only(self):
67*9c5db199SXin Li        """Test time bounds with --until only.
68*9c5db199SXin Li
69*9c5db199SXin Li        Also tests that --until and -u are equivalent.
70*9c5db199SXin Li        """
71*9c5db199SXin Li        end_time = int(self.test_time) - 3600
72*9c5db199SXin Li        end_time_string = time_utils.epoch_time_to_date_string(end_time)
73*9c5db199SXin Li        for option in ['--until', '-u']:
74*9c5db199SXin Li            arguments = self._try_parse([option, end_time_string])
75*9c5db199SXin Li            self.assertEqual(arguments.until, end_time)
76*9c5db199SXin Li            self._check_duration(arguments, dut_status._DEFAULT_DURATION)
77*9c5db199SXin Li
78*9c5db199SXin Li    def test_duration_only(self):
79*9c5db199SXin Li        """Test time bounds with --duration only.
80*9c5db199SXin Li
81*9c5db199SXin Li        Also tests that --duration and -d are equivalent.
82*9c5db199SXin Li        """
83*9c5db199SXin Li        for option in ['--duration', '-d']:
84*9c5db199SXin Li            duration = 4
85*9c5db199SXin Li            duration_string = '%d' % duration
86*9c5db199SXin Li            end_time = int(self.test_time)
87*9c5db199SXin Li            arguments = self._try_parse([option, duration_string])
88*9c5db199SXin Li            self.assertEqual(arguments.until, end_time)
89*9c5db199SXin Li            self._check_duration(arguments, duration)
90*9c5db199SXin Li
91*9c5db199SXin Li    def test_start_and_end(self):
92*9c5db199SXin Li        """Test time bounds with --since and --until."""
93*9c5db199SXin Li        start_time = int(self.test_time) - 5 * 3600
94*9c5db199SXin Li        start_time_string = time_utils.epoch_time_to_date_string(start_time)
95*9c5db199SXin Li        end_time = start_time + 4 * 3600
96*9c5db199SXin Li        end_time_string = time_utils.epoch_time_to_date_string(end_time)
97*9c5db199SXin Li        arguments = self._try_parse(['-s', start_time_string,
98*9c5db199SXin Li                                     '-u', end_time_string])
99*9c5db199SXin Li        self.assertEqual(arguments.since, start_time)
100*9c5db199SXin Li        self.assertEqual(arguments.until, end_time)
101*9c5db199SXin Li
102*9c5db199SXin Li    def test_start_and_duration(self):
103*9c5db199SXin Li        """Test time bounds with --since and --duration."""
104*9c5db199SXin Li        start_time = int(self.test_time) - 5 * 3600
105*9c5db199SXin Li        start_time_string = time_utils.epoch_time_to_date_string(start_time)
106*9c5db199SXin Li        duration = 4
107*9c5db199SXin Li        duration_string = '%d' % duration
108*9c5db199SXin Li        arguments = self._try_parse(['-s', start_time_string,
109*9c5db199SXin Li                                     '-d', duration_string])
110*9c5db199SXin Li        self.assertEqual(arguments.since, start_time)
111*9c5db199SXin Li        self._check_duration(arguments, duration)
112*9c5db199SXin Li
113*9c5db199SXin Li    def test_end_and_duration(self):
114*9c5db199SXin Li        """Test time bounds with --until and --duration."""
115*9c5db199SXin Li        end_time = int(self.test_time) - 5 * 3600
116*9c5db199SXin Li        end_time_string = time_utils.epoch_time_to_date_string(end_time)
117*9c5db199SXin Li        duration = 4
118*9c5db199SXin Li        duration_string = '%d' % duration
119*9c5db199SXin Li        arguments = self._try_parse(['-u', end_time_string,
120*9c5db199SXin Li                                     '-d', duration_string])
121*9c5db199SXin Li        self.assertEqual(arguments.until, end_time)
122*9c5db199SXin Li        self._check_duration(arguments, duration)
123*9c5db199SXin Li
124*9c5db199SXin Li    def test_all_options(self):
125*9c5db199SXin Li        """Test that all three options are a fatal error."""
126*9c5db199SXin Li        start_time = int(self.test_time) - 5 * 3600
127*9c5db199SXin Li        start_time_string = time_utils.epoch_time_to_date_string(start_time)
128*9c5db199SXin Li        duration = 4
129*9c5db199SXin Li        duration_string = '%d' % duration
130*9c5db199SXin Li        end_time = start_time + duration * 3600
131*9c5db199SXin Li        end_time_string = time_utils.epoch_time_to_date_string(end_time)
132*9c5db199SXin Li        with self.assertRaises(SystemExit):
133*9c5db199SXin Li            self._try_parse(['-s', start_time_string,
134*9c5db199SXin Li                             '-u', end_time_string,
135*9c5db199SXin Li                             '-d', duration_string])
136*9c5db199SXin Li
137*9c5db199SXin Li
138*9c5db199SXin Liif __name__ == '__main__':
139*9c5db199SXin Li    unittest.main()
140