# -*- coding: utf-8 -*-
'''
    integration.loader.ext_grains
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Test Salt's loader regarding external grains
'''

# Import Python libs
from __future__ import absolute_import, print_function, unicode_literals
import os
import time

# Import Salt Testing libs
from tests.support.case import ModuleCase
from tests.support.paths import TMP
from tests.support.unit import skipIf

# Import salt libs
import salt.config
import salt.loader


class LoaderGrainsTest(ModuleCase):
    '''
    Test the loader standard behavior with external grains
    '''

    #def setUp(self):
    #    self.opts = minion_config(None)
    #    self.opts['disable_modules'] = ['pillar']
    #    self.opts['grains'] = grains(self.opts)

    def test_grains_overwrite(self):
        # Force a grains sync
        self.run_function('saltutil.sync_grains')
        # To avoid a race condition on Windows, we need to make sure the
        # `test_custom_grain2.py` file is present in the _grains directory
        # before trying to get the grains. This test may execute before the
        # minion has finished syncing down the files it needs.
        module = os.path.join(TMP, 'rootdir', 'cache', 'files',
                              'base', '_grains', 'test_custom_grain2.py')
        tries = 0
        while not os.path.exists(module):
            tries += 1
            if tries > 60:
                break
            time.sleep(1)
        grains = self.run_function('grains.items')

        # Check that custom grains are overwritten
        self.assertEqual({'k2': 'v2'}, grains['a_custom'])


@skipIf(True, "needs a way to reload minion after config change")
class LoaderGrainsMergeTest(ModuleCase):
    '''
    Test the loader deep merge behavior with external grains
    '''

    def setUp(self):
        # XXX: This seems like it should become a unit test instead
        self.opts = salt.config.minion_config(None)
        self.opts['grains_deep_merge'] = True
        self.assertTrue(self.opts['grains_deep_merge'])
        self.opts['disable_modules'] = ['pillar']
        __grains__ = salt.loader.grains(self.opts)

    def test_grains_merge(self):
        __grain__ = self.run_function('grains.item', ['a_custom'])

        # Check that the grain is present
        self.assertIn('a_custom', __grain__)
        # Check that the grains are merged
        self.assertEqual({'k1': 'v1', 'k2': 'v2'}, __grain__['a_custom'])
