# Copyright 2019 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.
from autotest_lib.client.common_lib import error
from autotest_lib.client.common_lib import utils

from autotest_lib.client.common_lib.cros import arc
from autotest_lib.client.cros.enterprise import enterprise_policy_base


class policy_ArcBackupRestoreServiceEnabled(
        enterprise_policy_base.EnterprisePolicyTest):
    """
    Test effect of policy_ArcBackupRestoreServiceEnabled policy on the
    ARC++ container within ChromeOS.

    """
    version = 1

    def verify_policy(self, case):
        """
        Verify the policy was properly set

        @param case: integer, value of the policy setting

        """
        if case:
            e_msg = 'Backup manager is disabled and should be enabled.'
        else:
            e_msg = 'Backup manager is enabled and should be disabled.'

        # Give the ARC container time to setup and configure its policy.
        utils.poll_for_condition(
            lambda: self.check_bmgr(case),
            exception=error.TestFail(e_msg),
            timeout=45,
            sleep_interval=5,
            desc='Checking bmgr status')

    def check_bmgr(self, case):
        """
        Check if Android backup and recovery is accessible.

        @param case: integer, value of the policy setting

        @Returns True if accessible and set correctly, False otherwise.

        """
        b_and_r_status = arc.adb_shell('bmgr enabled')

        if case:
            if "Backup Manager currently enabled" not in b_and_r_status:
                return False

        else:
            if "Backup Manager currently disabled" not in b_and_r_status:
                return False

        return True

    def run_once(self, case):
        """
        @param case: integer, value of the policy setting

        """
        pol = {'ArcEnabled': True,
               'ArcBackupRestoreServiceEnabled': case}
        self.setup_case(user_policies=pol,
                        arc_mode='enabled',
                        use_clouddpc_test=False)
        self.verify_policy(case)
