15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2012 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import logging
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import pyauto_functional  # Must be imported before pyauto
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import pyauto
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)sys.path.append('/usr/local')  # To make autotest libs importable.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from autotest.cros import cros_ui
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)from autotest.cros import ownership
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ChromeosTime(pyauto.PyUITest):
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Tests for the ChromeOS status area clock and timezone settings."""
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def setUp(self):
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cros_ui.fake_ownership()
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pyauto.PyUITest.setUp(self)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self._initial_timezone = self.GetTimeInfo()['timezone']
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def tearDown(self):
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.SetTimezone(self._initial_timezone)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pyauto.PyUITest.tearDown(self)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ownership.clear_ownership()
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testTimeInfo(self):
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Print the the display time, date, and timezone."""
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    logging.debug(self.GetTimeInfo())
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSetTimezone(self):
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Sanity test to make sure setting the timezone works."""
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.SetTimezone('America/Los_Angeles')
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    pacific_time = self.GetTimeInfo()['display_time']
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.SetTimezone('America/New_York')
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    eastern_time = self.GetTimeInfo()['display_time']
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertNotEqual(pacific_time, eastern_time,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        'Time zone changed but display time did not.')
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _IsTimezoneEditable(self):
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Check if the timezone is editable.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    It will navigate to the system settings page and verify that the
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    timezone settings drop down is not disabled.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Returns:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      True, if timezone dropdown is enabled
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      False, otherwise
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.NavigateToURL('chrome://settings-frame')
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ret = self.ExecuteJavascript("""
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var disabled = true;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var timezone = document.getElementById('timezone-select');
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if (timezone)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          disabled = timezone.disabled;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        domAutomationController.send(disabled.toString());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ret == 'false'
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testTimezoneIsEditable(self):
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Test that the timezone is always editable."""
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    # This test only makes sense if we are not running as the owner.
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertFalse(self.GetLoginInfo()['is_owner'])
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    editable = self._IsTimezoneEditable()
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.assertTrue(editable, msg='Timezone is not editable when not owner.')
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def _SetTimezoneInUI(self, timezone):
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.NavigateToURL('chrome://settings-frame/settings')
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    self.ExecuteJavascript("""
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var selectElement = document.getElementById('timezone-select');
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        selectElement.value = "%s";
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        var event = document.createEvent("HTMLEvents");
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        event.initEvent("change", true, true);
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        selectElement.dispatchEvent(event);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        domAutomationController.send("");
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """ % timezone)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  def testSetTimezoneUI(self):
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    """Test that the timezone UI changes internal settings.
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Set the Timezone on the settings page. Check the internal timezone
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    afterwards. Timezones should be always editable."""
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for timezone in ['America/Barbados', 'Europe/Helsinki']:
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self._SetTimezoneInUI(timezone)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      self.assertTrue(self.WaitUntil(lambda: self.GetTimeInfo()['timezone'],
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     expect_retval=timezone),
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      'Timezone not changed as expected.');
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if __name__ == '__main__':
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pyauto_functional.Main()
96