# -*- coding: utf-8 -*-
'''
Test the core grains
'''

# Import python libs
from __future__ import absolute_import, print_function, unicode_literals

# Import Salt Testing libs
from tests.support.case import ModuleCase
from tests.support.mixins import LoaderModuleMockMixin
from tests.support.unit import skipIf

# Import Salt libs
import salt.loader
import salt.utils.platform
if salt.utils.platform.is_windows():
    try:
        import salt.modules.reg
    except ImportError:
        pass


def _freebsd_or_openbsd():
    return salt.utils.platform.is_freebsd() or salt.utils.platform.is_openbsd()


class TestGrainsCore(ModuleCase):
    '''
    Test the core grains grains
    '''

    @skipIf(not _freebsd_or_openbsd(), 'Only run on FreeBSD or OpenBSD')
    def test_freebsd_openbsd_mem_total(self):
        '''
        test grains['mem_total']
        '''
        physmem = self.run_function('sysctl.get', ['hw.physmem'])
        self.assertEqual(
            self.run_function('grains.items')['mem_total'],
            int(physmem) / 1048576
        )

    @skipIf(not salt.utils.platform.is_openbsd(), 'Only run on OpenBSD')
    def test_openbsd_swap_total(self):
        '''
        test grains['swap_total']
        '''
        swapmem = self.run_function('cmd.run', ['swapctl -sk']).split(' ')[1]
        self.assertEqual(
            self.run_function('grains.items')['swap_total'],
            int(swapmem) / 1048576
        )


class TestGrainsReg(ModuleCase, LoaderModuleMockMixin):
    '''
    Test the core windows grains
    '''

    def setup_loader_modules(self):
        self.opts = opts = salt.config.DEFAULT_MINION_OPTS
        utils = salt.loader.utils(opts, whitelist=['reg'])
        return {
            salt.modules.reg: {
                '__opts__': opts,
                '__utils__': utils,
            }
        }

    @skipIf(not salt.utils.platform.is_windows(), 'Only run on Windows')
    def test_win_cpu_model(self):
        '''
        test grains['cpu_model']
        '''
        cpu_model_text = salt.modules.reg.read_value(
                'HKEY_LOCAL_MACHINE',
                'HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0',
                'ProcessorNameString').get('vdata')
        self.assertEqual(
            self.run_function('grains.items')['cpu_model'],
            cpu_model_text
        )
