# coding: utf-8

# Python libs
from __future__ import absolute_import

import datetime
import logging
from uuid import UUID

# Salt libs
import salt.beacons.journald as journald
import salt.utils.data
from tests.support.mixins import LoaderModuleMockMixin
from tests.support.mock import Mock

# Salt testing libs
from tests.support.unit import TestCase

log = logging.getLogger(__name__)

_STUB_JOURNALD_ENTRY = {
    "_BOOT_ID": UUID("ad3915a5-9008-4fec-a635-140606525497"),
    "__MONOTONIC_TIMESTAMP": (
        datetime.timedelta(4, 28586, 703069),
        UUID("ad3915a5-9008-4fec-a635-140606525497"),
    ),
    "_AUDIT_LOGINUID": 1000,
    "SYSLOG_FACILITY": 10,
    "_SYSTEMD_SLICE": u"system.slice",
    "_GID": 0,
    "__REALTIME_TIMESTAMP": datetime.datetime(2017, 6, 27, 20, 8, 16, 468468),
    "_AUDIT_SESSION": 351,
    "PRIORITY": 6,
    "_TRANSPORT": u"syslog",
    "_HOSTNAME": u"hostname",
    "_CAP_EFFECTIVE": u"3fffffffff",
    "_SYSTEMD_UNIT": u"ssh.service",
    "_MACHINE_ID": UUID("14fab5bb-228d-414b-bdf4-cbc62cb7ba54"),
    "_PID": 15091,
    "SYSLOG_IDENTIFIER": u"sshd",
    "_SOURCE_REALTIME_TIMESTAMP": datetime.datetime(2017, 6, 27, 20, 8, 16, 468454),
    "_SYSTEMD_CGROUP": u"/system.slice/ssh.service",
    "__CURSOR": "s=7711ee01b03446309383870171dd5839;i=a74e;b=ad3915a590084feca635140606525497;m=571f43f8 dd;t=552fc7ed1cdf4;x=4ca0a3d4f1905736",
    "_COMM": u"sshd",
    "_CMDLINE": u"sshd: gareth [priv]",
    "_SYSTEMD_INVOCATION_ID": u"38a5d5aad292426d93bfaab72a69c2ab",
    "_EXE": u"/usr/sbin/sshd",
    "_UID": 0,
    "SYSLOG_PID": 15091,
    "MESSAGE": u"pam_unix(sshd:session): session opened for user username by (uid=0)",
}


class SystemdJournaldMock(Mock):
    """ Request Mock"""

    returned_once = False

    def get_next(self, *args, **kwargs):
        if not self.returned_once:
            self.returned_once = True
            return _STUB_JOURNALD_ENTRY
        else:
            return None

    def seek_tail(self, *args, **kwargs):
        return {}

    def get_previous(self, *args, **kwargs):
        return {}


SYSTEMD_MOCK = SystemdJournaldMock()


class JournaldBeaconTestCase(TestCase, LoaderModuleMockMixin):
    """
    Test case for salt.beacons.journald
    """

    def setup_loader_modules(self):
        return {
            journald: {
                "__context__": {"systemd.journald": SYSTEMD_MOCK},
                "__salt__": {},
            }
        }

    def test_non_list_config(self):
        config = {}

        ret = journald.validate(config)

        self.assertEqual(
            ret, (False, "Configuration for journald beacon must be a list.")
        )

    def test_empty_config(self):
        config = [{}]

        ret = journald.validate(config)

        self.assertEqual(ret, (True, "Valid beacon configuration"))

    def test_journald_match(self):
        config = [{"services": {"sshd": {"SYSLOG_IDENTIFIER": "sshd", "PRIORITY": 6}}}]

        ret = journald.validate(config)

        self.assertEqual(ret, (True, "Valid beacon configuration"))

        _expected_return = salt.utils.data.simple_types_filter(_STUB_JOURNALD_ENTRY)
        _expected_return["tag"] = "sshd"

        ret = journald.beacon(config)
        self.assertEqual(ret, [_expected_return])
