# -*- coding: utf-8 -*-
'''
integration tests for mac_power
'''

# Import python libs
from __future__ import absolute_import, print_function

# Import Salt Testing libs
from salttesting import skipIf
from salttesting.helpers import ensure_in_syspath, destructiveTest

# Import salt libs
import integration
import salt.utils

ensure_in_syspath('../../')


@skipIf(not salt.utils.is_darwin()
        or not salt.utils.which('systemsetup')
        or salt.utils.get_uid(salt.utils.get_user()) != 0, 'Test requirements not met')
class MacPowerModuleTest(integration.ModuleCase):
    '''
    Validate the mac_power module
    '''
    def setUp(self):
        '''
        Get current settings
        '''
        # Get current settings
        self.COMPUTER_SLEEP = self.run_function('power.get_computer_sleep')
        self.DISPLAY_SLEEP = self.run_function('power.get_display_sleep')
        self.HARD_DISK_SLEEP = self.run_function('power.get_harddisk_sleep')

    def tearDown(self):
        '''
        Reset to original settings
        '''
        self.run_function('power.set_computer_sleep', [self.COMPUTER_SLEEP])
        self.run_function('power.set_display_sleep', [self.DISPLAY_SLEEP])
        self.run_function('power.set_harddisk_sleep', [self.HARD_DISK_SLEEP])

    @destructiveTest
    def test_computer_sleep(self):
        '''
        Test power.get_computer_sleep
        Test power.set_computer_sleep
        '''

        # Normal Functionality
        self.assertTrue(self.run_function('power.set_computer_sleep', [90]))
        self.assertEqual(
            self.run_function('power.get_computer_sleep'), 'after 90 minutes')
        self.assertTrue(self.run_function('power.set_computer_sleep', ['Off']))
        self.assertEqual(self.run_function('power.get_computer_sleep'), 'Never')

        # Test invalid input
        self.assertIn(
            'Invalid String Value for Minutes',
            self.run_function('power.set_computer_sleep', ['spongebob']))
        self.assertIn(
            'Invalid Integer Value for Minutes',
            self.run_function('power.set_computer_sleep', [0]))
        self.assertIn(
            'Invalid Integer Value for Minutes',
            self.run_function('power.set_computer_sleep', [181]))
        self.assertIn(
            'Invalid Boolean Value for Minutes',
            self.run_function('power.set_computer_sleep', [True]))

    @destructiveTest
    def test_display_sleep(self):
        '''
        Test power.get_display_sleep
        Test power.set_display_sleep
        '''

        # Normal Functionality
        self.assertTrue(self.run_function('power.set_display_sleep', [90]))
        self.assertEqual(
            self.run_function('power.get_display_sleep'), 'after 90 minutes')
        self.assertTrue(self.run_function('power.set_display_sleep', ['Off']))
        self.assertEqual(self.run_function('power.get_display_sleep'), 'Never')

        # Test invalid input
        self.assertIn(
            'Invalid String Value for Minutes',
            self.run_function('power.set_display_sleep', ['spongebob']))
        self.assertIn(
            'Invalid Integer Value for Minutes',
            self.run_function('power.set_display_sleep', [0]))
        self.assertIn(
            'Invalid Integer Value for Minutes',
            self.run_function('power.set_display_sleep', [181]))
        self.assertIn(
            'Invalid Boolean Value for Minutes',
            self.run_function('power.set_display_sleep', [True]))

    @destructiveTest
    def test_harddisk_sleep(self):
        '''
        Test power.get_harddisk_sleep
        Test power.set_harddisk_sleep
        '''

        # Normal Functionality
        self.assertTrue(self.run_function('power.set_harddisk_sleep', [90]))
        self.assertEqual(
            self.run_function('power.get_harddisk_sleep'), 'after 90 minutes')
        self.assertTrue(self.run_function('power.set_harddisk_sleep', ['Off']))
        self.assertEqual(self.run_function('power.get_harddisk_sleep'), 'Never')

        # Test invalid input
        self.assertIn(
            'Invalid String Value for Minutes',
            self.run_function('power.set_harddisk_sleep', ['spongebob']))
        self.assertIn(
            'Invalid Integer Value for Minutes',
            self.run_function('power.set_harddisk_sleep', [0]))
        self.assertIn(
            'Invalid Integer Value for Minutes',
            self.run_function('power.set_harddisk_sleep', [181]))
        self.assertIn(
            'Invalid Boolean Value for Minutes',
            self.run_function('power.set_harddisk_sleep', [True]))

    def test_restart_freeze(self):
        '''
        Test power.get_restart_freeze
        Test power.set_restart_freeze
        '''
        # Normal Functionality
        self.assertTrue(self.run_function('power.set_restart_freeze', ['on']))
        self.assertTrue(self.run_function('power.get_restart_freeze'))
        # This will return False because mac fails to actually make the change
        self.assertFalse(
            self.run_function('power.set_restart_freeze', ['off']))
        # Even setting to off returns true, it actually is never set
        # This is an apple bug
        self.assertTrue(self.run_function('power.get_restart_freeze'))


@skipIf(not salt.utils.is_darwin()
        or not salt.utils.which('systemsetup')
        or salt.utils.get_uid(salt.utils.get_user()) != 0, 'Test requirements not met')
class MacPowerModuleTestSleepOnPowerButton(integration.ModuleCase):
    '''
    Test power.get_sleep_on_power_button
    Test power.set_sleep_on_power_button
    '''
    SLEEP_ON_BUTTON = None

    def setUp(self):
        '''
        Check if function is available
        Get existing value
        '''
        # Is the function available
        ret = self.run_function('power.get_sleep_on_power_button')
        if isinstance(ret, bool):
            self.SLEEP_ON_BUTTON = self.run_function(
                'power.get_sleep_on_power_button')

    def tearDown(self):
        '''
        Reset to original value
        '''
        if self.SLEEP_ON_BUTTON is not None:
            self.run_function(
                'power.set_sleep_on_power_button', [self.SLEEP_ON_BUTTON])

    def test_sleep_on_power_button(self):
        '''
        Test power.get_sleep_on_power_button
        Test power.set_sleep_on_power_button
        '''
        # If available on this system, test it
        if self.SLEEP_ON_BUTTON is None:
            # Check for not available
            ret = self.run_function('power.get_sleep_on_power_button')
            self.assertIn('Error', ret)
        else:
            self.assertTrue(
                self.run_function('power.set_sleep_on_power_button', ['on']))
            self.assertTrue(
                self.run_function('power.get_sleep_on_power_button'))
            self.assertTrue(
                self.run_function('power.set_sleep_on_power_button', ['off']))
            self.assertFalse(
                self.run_function('power.get_sleep_on_power_button'))


@skipIf(not salt.utils.is_darwin()
        or not salt.utils.which('systemsetup')
        or salt.utils.get_uid(salt.utils.get_user()) != 0, 'Test requirements not met')
class MacPowerModuleTestRestartPowerFailure(integration.ModuleCase):
    '''
    Test power.get_restart_power_failure
    Test power.set_restart_power_failure
    '''
    RESTART_POWER = None

    def setUp(self):
        '''
        Check if function is available
        Get existing value
        '''
        # Is the function available
        ret = self.run_function('power.get_restart_power_failure')
        if isinstance(ret, bool):
            self.RESTART_POWER = ret

    def tearDown(self):
        '''
        Reset to original value
        '''
        if self.RESTART_POWER is not None:
            self.run_function(
                'power.set_sleep_on_power_button', [self.SLEEP_ON_BUTTON])

    def test_restart_power_failure(self):
        '''
        Test power.get_restart_power_failure
        Test power.set_restart_power_failure
        '''
        # If available on this system, test it
        if self.RESTART_POWER is None:
            # Check for not available
            ret = self.run_function('power.get_restart_power_failure')
            self.assertIn('Error', ret)
        else:
            self.assertTrue(
                self.run_function('power.set_restart_power_failure', ['on']))
            self.assertTrue(
                self.run_function('power.get_restart_power_failure'))
            self.assertTrue(
                self.run_function('power.set_restart_power_failure', ['off']))
            self.assertFalse(
                self.run_function('power.get_restart_power_failure'))


@skipIf(not salt.utils.is_darwin()
        or not salt.utils.which('systemsetup')
        or salt.utils.get_uid(salt.utils.get_user()) != 0, 'Test requirements not met')
class MacPowerModuleTestWakeOnNet(integration.ModuleCase):
    '''
    Test power.get_wake_on_network
    Test power.set_wake_on_network
    '''
    WAKE_ON_NET = None

    def setUp(self):
        '''
        Check if function is available
        Get existing value
        '''
        # Is the function available
        ret = self.run_function('power.get_wake_on_network')
        if isinstance(ret, bool):
            self.WAKE_ON_NET = ret

    def tearDown(self):
        '''
        Reset to original value
        '''
        if self.WAKE_ON_NET is not None:
            self.run_function('power.set_wake_on_network', [self.WAKE_ON_NET])

    def test_wake_on_network(self):
        '''
        Test power.get_wake_on_network
        Test power.set_wake_on_network
        '''
        # If available on this system, test it
        if self.WAKE_ON_NET is None:
            # Check for not available
            ret = self.run_function('power.get_wake_on_network')
            self.assertIn('Error', ret)
        else:
            self.assertTrue(
                self.run_function('power.set_wake_on_network', ['on']))
            self.assertTrue(self.run_function('power.get_wake_on_network'))
            self.assertTrue(
                self.run_function('power.set_wake_on_network', ['off']))
            self.assertFalse(self.run_function('power.get_wake_on_network'))


@skipIf(not salt.utils.is_darwin()
        or not salt.utils.which('systemsetup')
        or salt.utils.get_uid(salt.utils.get_user()) != 0, 'Test requirements not met')
class MacPowerModuleTestWakeOnModem(integration.ModuleCase):
    '''
    Test power.get_wake_on_modem
    Test power.set_wake_on_modem
    '''
    WAKE_ON_MODEM = None

    def setUp(self):
        '''
        Check if function is available
        Get existing value
        '''
        # Is the function available
        ret = self.run_function('power.get_wake_on_modem')
        if isinstance(ret, bool):
            self.WAKE_ON_MODEM = ret

    def tearDown(self):
        '''
        Reset to original value
        '''
        if self.WAKE_ON_MODEM is not None:
            self.run_function('power.set_wake_on_modem', [self.WAKE_ON_MODEM])

    def test_wake_on_modem(self):
        '''
        Test power.get_wake_on_modem
        Test power.set_wake_on_modem
        '''
        # If available on this system, test it
        if self.WAKE_ON_MODEM is None:
            # Check for not available
            ret = self.run_function('power.get_wake_on_modem')
            self.assertIn('Error', ret)
        else:
            self.assertTrue(
                self.run_function('power.set_wake_on_modem', ['on']))
            self.assertTrue(self.run_function('power.get_wake_on_modem'))
            self.assertTrue(
                self.run_function('power.set_wake_on_modem', ['off']))
            self.assertFalse(self.run_function('power.get_wake_on_modem'))


if __name__ == '__main__':
    from integration import run_tests
    run_tests(MacPowerModuleTest,
              MacPowerModuleTestSleepOnPowerButton,
              MacPowerModuleTestRestartPowerFailure,
              MacPowerModuleTestWakeOnNet,
              MacPowerModuleTestWakeOnModem)
