# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import logging
import os

from autotest_lib.client.bin import utils
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib.cros import chrome
from autotest_lib.client.cros.update_engine import nebraska_wrapper
from autotest_lib.client.cros.update_engine import update_engine_test

class autoupdate_UserData(update_engine_test.UpdateEngineTest):
    """
    Modifies some user settings and checks they were not reset by an update.

    This test is used as part of the server test autoupdate_DataPreserved.
    This test will make use of several private Chrome APIs:
    inputMethodPrivate: chrome/common/extensions/api/input_method_private.json
    languageSettingsPrivate: chrome/common/extensions/api/
                             language_settings_private.idl
    settingsPrivate: chrome/common/extensions/api/settings_private.idl

    """
    version = 1

    _TEST_FILE = '/home/chronos/user/Downloads/test.txt'
    _US_IME = '_comp_ime_jkghodnilhceideoidjikpgommlajknkxkb:us::eng'
    _US_INTL_IME = '_comp_ime_jkghodnilhceideoidjikpgommlajknkxkb:us:intl:eng'
    _TIME_ZONE_PREF = 'generated.resolve_timezone_by_geolocation_on_off'

    _GET_IME_JS = '''
        new Promise(function(resolve, reject) {
            chrome.inputMethodPrivate.getCurrentInputMethod(
                function(id) {
                    resolve(id);
                });
        })
    '''
    _GET_PREF_JS = '''
        new Promise(function(resolve, reject) {
            chrome.settingsPrivate.getPref("%s", function(pref) {
                resolve(pref['value']);
            });
        })
    '''
    _SET_IME_JS = 'chrome.inputMethodPrivate.setCurrentInputMethod("%s")'
    _SET_PREF_JS = ('chrome.settingsPrivate.setPref("%s", %s, '
                    'x => console.log(x))')


    def _modify_input_methods(self):
        """ Change default Input Method to US International."""
        current_ime = self._cr.autotest_ext.EvaluateJavaScript(
            self._GET_IME_JS, promise=True)
        logging.info('Current IME is %s', current_ime)
        add_ime_js = ('chrome.languageSettingsPrivate.addInputMethod("%s")' %
                      self._US_INTL_IME)
        self._cr.autotest_ext.EvaluateJavaScript(add_ime_js)
        self._cr.autotest_ext.EvaluateJavaScript(self._SET_IME_JS %
                                                 self._US_INTL_IME)
        new_ime = self._cr.autotest_ext.EvaluateJavaScript(self._GET_IME_JS)
        if current_ime == new_ime:
            raise error.TestFail('IME could not be changed before update.')


    def _modify_time_zone(self):
        """Change time zone to be user selected instead of automatic by IP."""
        current_time_zone = self._cr.autotest_ext.EvaluateJavaScript(
            self._GET_PREF_JS % self._TIME_ZONE_PREF, promise=True)
        logging.info('Calculating timezone by IP: %s', current_time_zone)
        self._cr.autotest_ext.EvaluateJavaScript(
            self._SET_PREF_JS % (self._TIME_ZONE_PREF, 'false'))
        new_timezone = self._cr.autotest_ext.EvaluateJavaScript(
            self._GET_PREF_JS % self._TIME_ZONE_PREF, promise=True)
        if current_time_zone == new_timezone:
            raise error.TestFail('Timezone detection could not be changed.')


    def _perform_after_update_checks(self):
        """Check the user preferences and files are the same."""
        with chrome.Chrome(dont_override_profile=True,
                           autotest_ext=True) as cr:
            # Check test file is still present.
            if not os.path.exists(self._TEST_FILE):
                raise error.TestFail('Test file was not present after update.')

            # Check IME has not changed.
            current_ime = cr.autotest_ext.EvaluateJavaScript(
                self._GET_IME_JS, promise=True)
            if current_ime != self._US_INTL_IME:
                raise error.TestFail('Input method was not preserved after'
                                     'update. Expected %s, Actual: %s' %
                                     (self._US_INTL_IME, current_ime))

            # Check that timezone is user selected.
            current_time_zone = cr.autotest_ext.EvaluateJavaScript(
                self._GET_PREF_JS % self._TIME_ZONE_PREF, promise=True)
            if current_time_zone:
                raise error.TestFail('Time zone detection was changed back to '
                                     'automatic.')


    def run_once(self, payload_url=None):
        """
        Tests that user settings are not reset by update.

        @param payload_url: The payload url to use.

        """
        if payload_url:
            with nebraska_wrapper.NebraskaWrapper(
                log_dir=self.resultsdir, payload_url=payload_url) as nebraska:
                with chrome.Chrome(autotest_ext=True) as cr:
                    self._cr = cr
                    utils.run(['echo', 'hello', '>', self._TEST_FILE])
                    self._modify_input_methods()
                    self._modify_time_zone()
                    self._check_for_update(
                        nebraska.get_update_url(critical_update=True))
                # Sign out of Chrome and wait for the update to complete.
                # If we waited for the update to complete and then logged out
                # the DUT will auto-reboot and the client test cannot return.
                self._wait_for_update_to_complete()
        else:
            self._perform_after_update_checks()
