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