# -*- coding: utf-8 -*-

# Import Python Libs
from __future__ import absolute_import, unicode_literals, print_function

# Import Salt Testing Libs
from tests.support.mock import NO_MOCK, NO_MOCK_REASON
from tests.support.unit import TestCase, skipIf

# Import Salt Libs
import salt.utils.platform
import salt.utils.win_pdh as win_pdh


@skipIf(NO_MOCK, NO_MOCK_REASON)
@skipIf(not salt.utils.platform.is_windows(), 'System is not Windows')
class WinPdhTestCase(TestCase):
    def test_list_objects(self):
        known_objects = ['Cache', 'Memory', 'Process', 'Processor', 'System']
        objects = win_pdh.list_objects()
        for item in known_objects:
            self.assertTrue(item in objects)

    def test_list_counters(self):
        counters = win_pdh.list_counters('Processor')
        known_counters = ['% Processor Time', '% User Time', '% DPC Time']
        for item in known_counters:
            self.assertTrue(item in counters)

    def test_list_instances(self):
        instances = win_pdh.list_instances('Processor')
        known_instances = ['0', '_Total']
        for item in known_instances:
            self.assertTrue(item in instances)

    def test_build_counter_list(self):
        counter_list = [
            ('Memory', None, 'Available Bytes'),
            ('Paging File', '*', '% Usage'),
            ('Processor', '*', '% Processor Time'),
            ('Server', None, 'Work Item Shortages'),
            ('Server Work Queues', '*', 'Queue Length'),
            ('System', None, 'Context Switches/sec'),
        ]
        resulting_list = win_pdh.build_counter_list(counter_list)
        for counter in resulting_list:
            self.assertTrue(isinstance(counter, win_pdh.Counter))

        resulting_paths = []
        for counter in resulting_list:
            resulting_paths.append(counter.path)

        expected_paths = [
            '\\Memory\\Available Bytes',
            '\\Paging File(*)\\% Usage',
            '\\Processor(*)\\% Processor Time',
            '\\Server\\Work Item Shortages',
            '\\Server Work Queues(*)\\Queue Length',
            '\\System\\Context Switches/sec']
        self.assertEqual(resulting_paths, expected_paths)

    def test_get_all_counters(self):
        results = win_pdh.get_all_counters('Processor')
        known_counters = [
            '\\Processor(*)\\% Processor Time',
            '\\Processor(*)\\% Idle Time',
            '\\Processor(*)\\DPC Rate',
            '\\Processor(*)\\% Privileged Time',
            '\\Processor(*)\\DPCs Queued/sec',
            '\\Processor(*)\\% Interrupt Time',
            '\\Processor(*)\\Interrupts/sec',
        ]
        for item in known_counters:
            self.assertTrue(item in results)

    def test_get_counters(self):
        counter_list = [
            ('Memory', None, 'Available Bytes'),
            ('Paging File', '*', '% Usage'),
            ('Processor', '*', '% Processor Time'),
            ('Server', None, 'Work Item Shortages'),
            ('Server Work Queues', '*', 'Queue Length'),
            ('System', None, 'Context Switches/sec'),
        ]
        results = win_pdh.get_counters(counter_list)
        expected_counters = [
            '\\Memory\\Available Bytes',
            '\\Paging File(*)\\% Usage',
            '\\Processor(*)\\% Processor Time',
            '\\Server\\Work Item Shortages',
            '\\Server Work Queues(*)\\Queue Length',
            '\\System\\Context Switches/sec'
        ]
        for item in expected_counters:
            self.assertTrue(item in results)

    def test_get_counter(self):
        results = win_pdh.get_counter('Processor', '*', '% Processor Time')
        self.assertTrue('\\Processor(*)\\% Processor Time' in results)
